Cuberite
A lightweight, fast and extensible game server for Minecraft
BlockHandler.cpp
Go to the documentation of this file.
1 #include "Globals.h"
2 
3 #include "BlockHandler.h"
4 #include "../Item.h"
5 #include "../World.h"
6 #include "../Chunk.h"
7 #include "BlockPluginInterface.h"
8 #include "BlockAir.h"
9 #include "BlockAnvil.h"
10 #include "BlockBanner.h"
11 #include "BlockBed.h"
12 #include "BlockBigFlower.h"
13 #include "BlockBookShelf.h"
14 #include "BlockBrewingStand.h"
15 #include "BlockButton.h"
16 #include "BlockCactus.h"
17 #include "BlockCake.h"
18 #include "BlockCarpet.h"
19 #include "BlockCauldron.h"
20 #include "BlockChest.h"
21 #include "BlockCloth.h"
22 #include "BlockCobWeb.h"
23 #include "BlockCocoaPod.h"
24 #include "BlockCommandBlock.h"
25 #include "BlockComparator.h"
26 #include "BlockConcretePowder.h"
27 #include "BlockCrops.h"
28 #include "BlockDaylightSensor.h"
29 #include "BlockDeadBush.h"
30 #include "BlockDefaultBlock.h"
31 #include "BlockDirt.h"
32 #include "BlockDoor.h"
33 #include "BlockDropSpenser.h"
34 #include "BlockEnchantingTable.h"
35 #include "BlockEndPortalFrame.h"
36 #include "BlockEnderChest.h"
37 #include "BlockEntity.h"
38 #include "BlockFarmland.h"
39 #include "BlockFence.h"
40 #include "BlockFenceGate.h"
41 #include "BlockFire.h"
42 #include "BlockFlower.h"
43 #include "BlockFlowerPot.h"
44 #include "BlockFluid.h"
45 #include "BlockFurnace.h"
46 #include "BlockGlass.h"
47 #include "BlockGlazedTerracotta.h"
48 #include "BlockGlowstone.h"
49 #include "BlockGrass.h"
50 #include "BlockGravel.h"
51 #include "BlockHopper.h"
52 #include "BlockHugeMushroom.h"
53 #include "BlockIce.h"
54 #include "BlockJukebox.h"
55 #include "BlockLadder.h"
56 #include "BlockLeaves.h"
57 #include "BlockLever.h"
58 #include "BlockLilypad.h"
59 #include "BlockMelon.h"
60 #include "BlockMobHead.h"
61 #include "BlockMobSpawner.h"
62 #include "BlockInfested.h"
63 #include "BlockMushroom.h"
64 #include "BlockMycelium.h"
65 #include "BlockNetherWart.h"
66 #include "BlockNetherrack.h"
67 #include "BlockNoteBlock.h"
68 #include "BlockObserver.h"
69 #include "BlockOre.h"
70 #include "BlockPackedIce.h"
71 #include "BlockPiston.h"
72 #include "BlockPlanks.h"
73 #include "BlockPortal.h"
74 #include "BlockPressurePlate.h"
75 #include "BlockPumpkin.h"
76 #include "BlockQuartz.h"
77 #include "BlockRail.h"
78 #include "BlockRedstoneWire.h"
79 #include "BlockRedstoneLamp.h"
80 #include "BlockRedstoneOre.h"
81 #include "BlockRedstoneRepeater.h"
82 #include "BlockSand.h"
83 #include "BlockSapling.h"
84 #include "BlockSeaLantern.h"
85 #include "BlockSideways.h"
86 #include "BlockSignPost.h"
87 #include "BlockSlab.h"
88 #include "BlockSlime.h"
89 #include "BlockSnow.h"
90 #include "BlockSponge.h"
91 #include "BlockStairs.h"
92 #include "BlockStems.h"
93 #include "BlockStone.h"
94 #include "BlockSugarCane.h"
95 #include "BlockTNT.h"
96 #include "BlockTallGrass.h"
97 #include "BlockTorch.h"
98 #include "BlockTrapdoor.h"
99 #include "BlockTripwire.h"
100 #include "BlockTripwireHook.h"
101 #include "BlockVines.h"
102 #include "BlockWallSign.h"
103 #include "BlockWorkbench.h"
104 
105 
106 
107 
108 
109 /*
110 // Tests the meta rotation and mirroring.
111 // Note that the cMetaRotator needs to have its assert paths disabled for this test to work!
112 static class cBlockHandlerRotationTester
113 {
114 public:
115  cBlockHandlerRotationTester(void)
116  {
117  printf("Performing block handlers test...\n");
118  for (BLOCKTYPE Type = 0; Type < E_BLOCK_MAX_TYPE_ID; Type++)
119  {
120  cBlockHandler * Handler = cBlockInfo::GetHandler(Type);
121  if (Handler == nullptr)
122  {
123  printf("nullptr handler for block type %d!\n", Type);
124  continue;
125  }
126  AString BlockName = ItemTypeToString(Type);
127  for (NIBBLETYPE Meta = 0; Meta < 16; Meta++)
128  {
129  // Test the CW / CCW rotations:
130  NIBBLETYPE TestMeta;
131  TestMeta = Handler->MetaRotateCW(Handler->MetaRotateCW(Handler->MetaRotateCW(Handler->MetaRotateCW(Meta))));
132  if (TestMeta != Meta)
133  {
134  // 4 CW rotations should produce no change in the meta
135  printf("Handler for blocktype %d (%s) fails CW 4-rotation test for meta %d: got back %d\n", Type, BlockName.c_str(), Meta, TestMeta);
136  }
137  TestMeta = Handler->MetaRotateCCW(Handler->MetaRotateCCW(Handler->MetaRotateCCW(Handler->MetaRotateCCW(Meta))));
138  if (TestMeta != Meta)
139  {
140  // 4 CCW rotations should produce no change in the meta
141  printf("Handler for blocktype %d (%s) fails CCW 4-rotation test for meta %d: got back %d\n", Type, BlockName.c_str(), Meta, TestMeta);
142  }
143  TestMeta = Handler->MetaRotateCCW(Handler->MetaRotateCW(Meta));
144  if (TestMeta != Meta)
145  {
146  // CCW rotation of a CW rotation should produce no change in the meta
147  printf("Handler for blocktype %d (%s) fails CCW(CW) rotation test for meta %d: got back %d\n", Type, BlockName.c_str(), Meta, TestMeta);
148  }
149  TestMeta = Handler->MetaRotateCW(Handler->MetaRotateCCW(Meta));
150  if (TestMeta != Meta)
151  {
152  // CW rotation of a CCW rotation should produce no change in the meta
153  printf("Handler for blocktype %d (%s) fails CW(CCW) rotation test for meta %d: got back %d\n", Type, BlockName.c_str(), Meta, TestMeta);
154  }
155 
156  // Test the mirroring:
157  TestMeta = Handler->MetaMirrorXY(Handler->MetaMirrorXY(Meta));
158  if (TestMeta != Meta)
159  {
160  // Double-mirroring should produce the same meta:
161  printf("Handler for blocktype %d (%s) fails XY mirror test for meta %d: got back %d\n", Type, BlockName.c_str(), Meta, TestMeta);
162  }
163  TestMeta = Handler->MetaMirrorXZ(Handler->MetaMirrorXZ(Meta));
164  if (TestMeta != Meta)
165  {
166  // Double-mirroring should produce the same meta:
167  printf("Handler for blocktype %d (%s) fails XZ mirror test for meta %d: got back %d\n", Type, BlockName.c_str(), Meta, TestMeta);
168  }
169  TestMeta = Handler->MetaMirrorYZ(Handler->MetaMirrorYZ(Meta));
170  if (TestMeta != Meta)
171  {
172  // Double-mirroring should produce the same meta:
173  printf("Handler for blocktype %d (%s) fails YZ mirror test for meta %d: got back %d\n", Type, BlockName.c_str(), Meta, TestMeta);
174  }
175 
176  // Test mirror-rotating:
177  TestMeta = Handler->MetaRotateCW(Handler->MetaRotateCW(Handler->MetaMirrorXY(Handler->MetaMirrorYZ(Meta))));
178  if (TestMeta != Meta)
179  {
180  // 2 CW rotations should be the same as XY, YZ mirroring:
181  printf("Handler for blocktype %d (%s) fails rotation-mirror test for meta %d: got back %d\n", Type, BlockName.c_str(), Meta, TestMeta);
182  }
183  }
184  } // for Type
185  printf("Block handlers test complete.\n");
186  }
187 } g_BlockHandlerRotationTester;
188 //*/
189 
190 
191 
192 
193 
196 namespace
197 {
198  constexpr cBlockDoorHandler BlockAcaciaDoorHandler (E_BLOCK_ACACIA_DOOR);
199  constexpr cBlockFenceGateHandler BlockAcaciaFenceGateHandler (E_BLOCK_ACACIA_FENCE_GATE);
200  constexpr cBlockFenceHandler BlockAcaciaFenceHandler (E_BLOCK_ACACIA_FENCE);
201  constexpr cBlockStairsHandler BlockAcaciaWoodStairsHandler (E_BLOCK_ACACIA_WOOD_STAIRS);
202  constexpr cBlockRailHandler BlockActivatorRailHandler (E_BLOCK_ACTIVATOR_RAIL);
203  constexpr cBlockComparatorHandler BlockActiveComparatorHandler (E_BLOCK_ACTIVE_COMPARATOR);
204  constexpr cBlockAirHandler BlockAirHandler (E_BLOCK_AIR);
205  constexpr cBlockAnvilHandler BlockAnvilHandler (E_BLOCK_ANVIL);
206  constexpr cDefaultBlockHandler BlockBarrierHandler (E_BLOCK_BARRIER);
207  constexpr cDefaultBlockEntityHandler BlockBeaconHandler (E_BLOCK_BEACON);
208  constexpr cBlockBedHandler BlockBedHandler (E_BLOCK_BED);
209  constexpr cDefaultBlockHandler BlockBedrockHandler (E_BLOCK_BEDROCK);
210  constexpr cBlockCropsHandler<3> BlockBeetrootsHandler (E_BLOCK_BEETROOTS); // 4 stages of growth
211  constexpr cBlockBigFlowerHandler BlockBigFlowerHandler (E_BLOCK_BIG_FLOWER);
212  constexpr cBlockDoorHandler BlockBirchDoorHandler (E_BLOCK_BIRCH_DOOR);
213  constexpr cBlockFenceGateHandler BlockBirchFenceGateHandler (E_BLOCK_BIRCH_FENCE_GATE);
214  constexpr cBlockFenceHandler BlockBirchFenceHandler (E_BLOCK_BIRCH_FENCE);
215  constexpr cBlockStairsHandler BlockBirchWoodStairsHandler (E_BLOCK_BIRCH_WOOD_STAIRS);
216  constexpr cBlockGlazedTerracottaHandler BlockBlackGlazedTerracottaHandler (E_BLOCK_BLACK_GLAZED_TERRACOTTA);
217  constexpr cDefaultBlockHandler BlockBlackShulkerBoxHandler (E_BLOCK_BLACK_SHULKER_BOX);
218  constexpr cBlockGlazedTerracottaHandler BlockBlueGlazedTerracottaHandler (E_BLOCK_BLUE_GLAZED_TERRACOTTA);
219  constexpr cDefaultBlockHandler BlockBlueShulkerBoxHandler (E_BLOCK_BLUE_SHULKER_BOX);
220  constexpr cDefaultBlockHandler BlockBoneBlockHandler (E_BLOCK_BONE_BLOCK);
221  constexpr cBlockBookShelfHandler BlockBookcaseHandler (E_BLOCK_BOOKCASE);
222  constexpr cBlockBrewingStandHandler BlockBrewingStandHandler (E_BLOCK_BREWING_STAND);
223  constexpr cDefaultBlockHandler BlockBricksHandler (E_BLOCK_BRICK);
224  constexpr cBlockStairsHandler BlockBrickStairsHandler (E_BLOCK_BRICK_STAIRS);
225  constexpr cBlockGlazedTerracottaHandler BlockBrownGlazedTerracottaHandler (E_BLOCK_BROWN_GLAZED_TERRACOTTA);
226  constexpr cBlockMushroomHandler BlockBrownMushroomHandler (E_BLOCK_BROWN_MUSHROOM);
227  constexpr cDefaultBlockHandler BlockBrownShulkerBoxHandler (E_BLOCK_BROWN_SHULKER_BOX);
228  constexpr cBlockCactusHandler BlockCactusHandler (E_BLOCK_CACTUS);
229  constexpr cBlockCakeHandler BlockCakeHandler (E_BLOCK_CAKE);
230  constexpr cBlockCarpetHandler BlockCarpetHandler (E_BLOCK_CARPET);
231  constexpr cBlockCropsHandler<7> BlockCarrotsHandler (E_BLOCK_CARROTS); // 8 stages of growth
232  constexpr cBlockCauldronHandler BlockCauldronHandler (E_BLOCK_CAULDRON);
233  constexpr cBlockCommandBlockHandler BlockChainCommandBlockHandler (E_BLOCK_CHAIN_COMMAND_BLOCK);
234  constexpr cBlockChestHandler BlockChestHandler (E_BLOCK_CHEST);
235  constexpr cDefaultBlockHandler BlockChorusFlowerHandler (E_BLOCK_CHORUS_FLOWER);
236  constexpr cDefaultBlockHandler BlockChorusPlantHandler (E_BLOCK_CHORUS_PLANT);
237  constexpr cDefaultOreHandler BlockClayHandler (E_BLOCK_CLAY);
238  constexpr cDefaultBlockHandler BlockCoalBlockHandler (E_BLOCK_BLOCK_OF_COAL);
239  constexpr cDefaultOreHandler BlockCoalOreHandler (E_BLOCK_COAL_ORE);
240  constexpr cDefaultBlockHandler BlockCobblestoneHandler (E_BLOCK_COBBLESTONE);
241  constexpr cBlockStairsHandler BlockCobblestoneStairsHandler (E_BLOCK_COBBLESTONE_STAIRS);
242  constexpr cDefaultBlockHandler BlockCobblestoneWallHandler (E_BLOCK_COBBLESTONE_WALL);
243  constexpr cBlockCobWebHandler BlockCobwebHandler (E_BLOCK_COBWEB);
244  constexpr cBlockCocoaPodHandler BlockCocoaPodHandler (E_BLOCK_COCOA_POD);
245  constexpr cBlockCommandBlockHandler BlockCommandBlockHandler (E_BLOCK_COMMAND_BLOCK);
246  constexpr cDefaultBlockHandler BlockConcreteHandler (E_BLOCK_CONCRETE);
247  constexpr cBlockConcretePowderHandler BlockConcretePowderHandler (E_BLOCK_CONCRETE_POWDER);
248  constexpr cBlockCropsHandler<7> BlockCropsHandler (E_BLOCK_CROPS); // 8 stages of growth
249  constexpr cBlockGlazedTerracottaHandler BlockCyanGlazedTerracottaHandler (E_BLOCK_CYAN_GLAZED_TERRACOTTA);
250  constexpr cDefaultBlockHandler BlockCyanShulkerBoxHandler (E_BLOCK_CYAN_SHULKER_BOX);
251  constexpr cBlockDoorHandler BlockDarkOakDoorHandler (E_BLOCK_DARK_OAK_DOOR);
252  constexpr cBlockFenceGateHandler BlockDarkOakFenceGateHandler (E_BLOCK_DARK_OAK_FENCE_GATE);
253  constexpr cBlockFenceHandler BlockDarkOakFenceHandler (E_BLOCK_DARK_OAK_FENCE);
254  constexpr cBlockStairsHandler BlockDarkOakWoodStairsHandler (E_BLOCK_DARK_OAK_WOOD_STAIRS);
255  constexpr cBlockDaylightSensorHandler BlockDaylightSensorHandler (E_BLOCK_DAYLIGHT_SENSOR);
256  constexpr cBlockDeadBushHandler BlockDeadBushHandler (E_BLOCK_DEAD_BUSH);
257  constexpr cBlockRailHandler BlockDetectorRailHandler (E_BLOCK_DETECTOR_RAIL);
258  constexpr cDefaultBlockHandler BlockDiamondBlockHandler (E_BLOCK_DIAMOND_BLOCK);
259  constexpr cDefaultOreHandler BlockDiamondOreHandler (E_BLOCK_DIAMOND_ORE);
260  constexpr cBlockDirtHandler BlockDirtHandler (E_BLOCK_DIRT);
261  constexpr cBlockDropSpenserHandler BlockDispenserHandler (E_BLOCK_DISPENSER);
262  constexpr cBlockDoubleSlabHandler BlockDoubleRedSandstoneSlabHandler(E_BLOCK_DOUBLE_RED_SANDSTONE_SLAB);
263  constexpr cBlockDoubleSlabHandler BlockDoubleStoneSlabHandler (E_BLOCK_DOUBLE_STONE_SLAB);
264  constexpr cBlockDoubleSlabHandler BlockDoubleWoodenSlabHandler (E_BLOCK_DOUBLE_WOODEN_SLAB);
265  constexpr cDefaultBlockHandler BlockDragonEggHandler (E_BLOCK_DRAGON_EGG);
266  constexpr cBlockDropSpenserHandler BlockDropperHandler (E_BLOCK_DROPPER);
267  constexpr cDefaultBlockHandler BlockEmeraldBlockHandler (E_BLOCK_EMERALD_BLOCK);
268  constexpr cDefaultOreHandler BlockEmeraldOreHandler (E_BLOCK_EMERALD_ORE);
269  constexpr cBlockEnchantingTableHandler BlockEnchantingTableHandler (E_BLOCK_ENCHANTMENT_TABLE);
270  constexpr cDefaultBlockHandler BlockEndBricksHandler (E_BLOCK_END_BRICKS);
271  constexpr cBlockEnderChestHandler BlockEnderChestHandler (E_BLOCK_ENDER_CHEST);
272  constexpr cDefaultBlockHandler BlockEndGatewayHandler (E_BLOCK_END_GATEWAY);
273  constexpr cBlockEndPortalFrameHandler BlockEndPortalFrameHandler (E_BLOCK_END_PORTAL_FRAME);
274  constexpr cDefaultBlockHandler BlockEndPortalHandler (E_BLOCK_END_PORTAL);
275  constexpr cDefaultBlockHandler BlockEndRodHandler (E_BLOCK_END_ROD);
276  constexpr cDefaultBlockHandler BlockEndStoneHandler (E_BLOCK_END_STONE);
277  constexpr cBlockFarmlandHandler BlockFarmlandHandler (E_BLOCK_FARMLAND);
278  constexpr cBlockFenceHandler BlockFenceHandler (E_BLOCK_FENCE);
279  constexpr cBlockFireHandler BlockFireHandler (E_BLOCK_FIRE);
280  constexpr cBlockFlowerPotHandler BlockFlowerPotHandler (E_BLOCK_FLOWER_POT);
281  constexpr cBlockIceHandler BlockFrostedIceHandler (E_BLOCK_FROSTED_ICE);
282  constexpr cBlockFurnaceHandler BlockFurnaceHandler (E_BLOCK_FURNACE);
283  constexpr cBlockGlassHandler BlockGlassHandler (E_BLOCK_GLASS);
284  constexpr cBlockGlassHandler BlockGlassPaneHandler (E_BLOCK_GLASS_PANE);
285  constexpr cBlockGlowstoneHandler BlockGlowstoneHandler (E_BLOCK_GLOWSTONE);
286  constexpr cDefaultBlockHandler BlockGoldBlockHandler (E_BLOCK_GOLD_BLOCK);
287  constexpr cDefaultOreHandler BlockGoldOreHandler (E_BLOCK_GOLD_ORE);
288  constexpr cBlockGrassHandler BlockGrassHandler (E_BLOCK_GRASS);
289  constexpr cDefaultBlockHandler BlockGrassPathHandler (E_BLOCK_GRASS_PATH);
290  constexpr cBlockGravelHandler BlockGravelHandler (E_BLOCK_GRAVEL);
291  constexpr cBlockGlazedTerracottaHandler BlockGrayGlazedTerracottaHandler (E_BLOCK_GRAY_GLAZED_TERRACOTTA);
292  constexpr cDefaultBlockHandler BlockGrayShulkerBoxHandler (E_BLOCK_GRAY_SHULKER_BOX);
293  constexpr cBlockGlazedTerracottaHandler BlockGreenGlazedTerracottaHandler (E_BLOCK_GREEN_GLAZED_TERRACOTTA);
294  constexpr cDefaultBlockHandler BlockGreenShulkerBoxHandler (E_BLOCK_GREEN_SHULKER_BOX);
295  constexpr cDefaultBlockHandler BlockHardenedClayHandler (E_BLOCK_HARDENED_CLAY);
296  constexpr cBlockSidewaysHandler BlockHayBaleHandler (E_BLOCK_HAY_BALE);
297  constexpr cBlockMobHeadHandler BlockHeadHandler (E_BLOCK_HEAD);
298  constexpr cBlockPressurePlateHandler BlockHeavyWeightedPressurePHandler(E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE);
299  constexpr cBlockHopperHandler BlockHopperHandler (E_BLOCK_HOPPER);
300  constexpr cBlockHugeMushroomHandler BlockHugeBrownMushroomHandler (E_BLOCK_HUGE_BROWN_MUSHROOM);
301  constexpr cBlockHugeMushroomHandler BlockHugeRedMushroomHandler (E_BLOCK_HUGE_RED_MUSHROOM);
302  constexpr cBlockIceHandler BlockIceHandler (E_BLOCK_ICE);
303  constexpr cBlockComparatorHandler BlockInactiveComparatorHandler (E_BLOCK_INACTIVE_COMPARATOR);
304  constexpr cBlockInfestedHandler BlockInfestedBlockHandler (E_BLOCK_SILVERFISH_EGG);
305  constexpr cDefaultBlockHandler BlockIronBarsHandler (E_BLOCK_IRON_BARS);
306  constexpr cDefaultBlockHandler BlockIronBlockHandler (E_BLOCK_IRON_BLOCK);
307  constexpr cBlockDoorHandler BlockIronDoorHandler (E_BLOCK_IRON_DOOR);
308  constexpr cDefaultOreHandler BlockIronOreHandler (E_BLOCK_IRON_ORE);
309  constexpr cBlockTrapdoorHandler BlockIronTrapdoorHandler (E_BLOCK_IRON_TRAPDOOR);
310  constexpr cBlockPumpkinHandler BlockJackOLanternHandler (E_BLOCK_JACK_O_LANTERN);
311  constexpr cBlockJukeboxHandler BlockJukeboxHandler (E_BLOCK_JUKEBOX);
312  constexpr cBlockDoorHandler BlockJungleDoorHandler (E_BLOCK_JUNGLE_DOOR);
313  constexpr cBlockFenceGateHandler BlockJungleFenceGateHandler (E_BLOCK_JUNGLE_FENCE_GATE);
314  constexpr cBlockFenceHandler BlockJungleFenceHandler (E_BLOCK_JUNGLE_FENCE);
315  constexpr cBlockStairsHandler BlockJungleWoodStairsHandler (E_BLOCK_JUNGLE_WOOD_STAIRS);
316  constexpr cBlockLadderHandler BlockLadderHandler (E_BLOCK_LADDER);
317  constexpr cDefaultBlockHandler BlockLapisBlockHandler (E_BLOCK_LAPIS_BLOCK);
318  constexpr cDefaultOreHandler BlockLapisOreHandler (E_BLOCK_LAPIS_ORE);
319  constexpr cBlockLavaHandler BlockLavaHandler (E_BLOCK_LAVA);
320  constexpr cBlockLeavesHandler BlockLeavesHandler (E_BLOCK_LEAVES);
321  constexpr cBlockLeverHandler BlockLeverHandler (E_BLOCK_LEVER);
322  constexpr cBlockGlazedTerracottaHandler BlockLightBlueGlazedTerracoHandler(E_BLOCK_LIGHT_BLUE_GLAZED_TERRACOTTA);
323  constexpr cDefaultBlockHandler BlockLightBlueShulkerBoxHandler (E_BLOCK_LIGHT_BLUE_SHULKER_BOX);
324  constexpr cBlockGlazedTerracottaHandler BlockLightGrayGlazedTerracoHandler(E_BLOCK_LIGHT_GRAY_GLAZED_TERRACOTTA);
325  constexpr cDefaultBlockHandler BlockLightGrayShulkerBoxHandler (E_BLOCK_LIGHT_GRAY_SHULKER_BOX);
326  constexpr cBlockPressurePlateHandler BlockLightWeightedPressurePHandler(E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE);
327  constexpr cBlockLilypadHandler BlockLilyPadHandler (E_BLOCK_LILY_PAD);
328  constexpr cBlockGlazedTerracottaHandler BlockLimeGlazedTerracottaHandler (E_BLOCK_LIME_GLAZED_TERRACOTTA);
329  constexpr cDefaultBlockHandler BlockLimeShulkerBoxHandler (E_BLOCK_LIME_SHULKER_BOX);
330  constexpr cBlockFurnaceHandler BlockLitFurnaceHandler (E_BLOCK_LIT_FURNACE);
331  constexpr cBlockSidewaysHandler BlockLogHandler (E_BLOCK_LOG);
332  constexpr cBlockGlazedTerracottaHandler BlockMagentaGlazedTerracottHandler(E_BLOCK_MAGENTA_GLAZED_TERRACOTTA);
333  constexpr cDefaultBlockHandler BlockMagentaShulkerBoxHandler (E_BLOCK_MAGENTA_SHULKER_BOX);
334  constexpr cDefaultBlockHandler BlockMagmaHandler (E_BLOCK_MAGMA);
335  constexpr cBlockMelonHandler BlockMelonHandler (E_BLOCK_MELON);
336  constexpr cBlockMelonStemHandler BlockMelonStemHandler (E_BLOCK_MELON_STEM);
337  constexpr cBlockMobSpawnerHandler BlockMobSpawnerHandler (E_BLOCK_MOB_SPAWNER);
338  constexpr cDefaultBlockHandler BlockMossyCobblestoneHandler (E_BLOCK_MOSSY_COBBLESTONE);
339  constexpr cBlockMyceliumHandler BlockMyceliumHandler (E_BLOCK_MYCELIUM);
340  constexpr cBlockFenceHandler BlockNetherBrickFenceHandler (E_BLOCK_NETHER_BRICK_FENCE);
341  constexpr cDefaultBlockHandler BlockNetherBricksHandler (E_BLOCK_NETHER_BRICK);
342  constexpr cBlockStairsHandler BlockNetherBrickStairsHandler (E_BLOCK_NETHER_BRICK_STAIRS);
343  constexpr cBlockPortalHandler BlockNetherPortalHandler (E_BLOCK_NETHER_PORTAL);
344  constexpr cDefaultOreHandler BlockNetherQuartzOreHandler (E_BLOCK_NETHER_QUARTZ_ORE);
345  constexpr cBlockNetherrack BlockNetherrackHandler (E_BLOCK_NETHERRACK);
346  constexpr cDefaultBlockHandler BlockNetherWartBlockHandler (E_BLOCK_NETHER_WART_BLOCK);
347  constexpr cBlockNetherWartHandler BlockNetherWartHandler (E_BLOCK_NETHER_WART);
348  constexpr cBlockLeavesHandler BlockNewLeavesHandler (E_BLOCK_NEW_LEAVES);
349  constexpr cBlockSidewaysHandler BlockNewLogHandler (E_BLOCK_NEW_LOG);
350  constexpr cBlockNoteBlockHandler BlockNoteBlockHandler (E_BLOCK_NOTE_BLOCK);
351  constexpr cBlockDoorHandler BlockOakDoorHandler (E_BLOCK_OAK_DOOR);
352  constexpr cBlockFenceGateHandler BlockOakFenceGateHandler (E_BLOCK_OAK_FENCE_GATE);
353  constexpr cBlockStairsHandler BlockOakWoodStairsHandler (E_BLOCK_OAK_WOOD_STAIRS);
354  constexpr cBlockObserverHandler BlockObserverHandler (E_BLOCK_OBSERVER);
355  constexpr cDefaultBlockHandler BlockObsidianHandler (E_BLOCK_OBSIDIAN);
356  constexpr cBlockGlazedTerracottaHandler BlockOrangeGlazedTerracottaHandler(E_BLOCK_ORANGE_GLAZED_TERRACOTTA);
357  constexpr cDefaultBlockHandler BlockOrangeShulkerBoxHandler (E_BLOCK_ORANGE_SHULKER_BOX);
358  constexpr cBlockPackedIceHandler BlockPackedIceHandler (E_BLOCK_PACKED_ICE);
359  constexpr cBlockGlazedTerracottaHandler BlockPinkGlazedTerracottaHandler (E_BLOCK_PINK_GLAZED_TERRACOTTA);
360  constexpr cDefaultBlockHandler BlockPinkShulkerBoxHandler (E_BLOCK_PINK_SHULKER_BOX);
361  constexpr cBlockPistonHandler BlockPistonHandler (E_BLOCK_PISTON);
362  constexpr cBlockPistonHeadHandler BlockPistonHeadHandler;
363  constexpr cDefaultBlockHandler BlockPistonMovedBlockHandler (E_BLOCK_PISTON_MOVED_BLOCK);
364  constexpr cBlockPlanksHandler BlockPlanksHandler (E_BLOCK_PLANKS);
365  constexpr cBlockCropsHandler<7> BlockPotatoesHandler (E_BLOCK_POTATOES); // 8 stages of growth
366  constexpr cBlockRailHandler BlockPoweredRailHandler (E_BLOCK_POWERED_RAIL);
367  constexpr cDefaultBlockHandler BlockPrismarineBlockHandler (E_BLOCK_PRISMARINE_BLOCK);
368  constexpr cBlockPumpkinHandler BlockPumpkinHandler (E_BLOCK_PUMPKIN);
369  constexpr cBlockPumpkinStemHandler BlockPumpkinStemHandler (E_BLOCK_PUMPKIN_STEM);
370  constexpr cBlockGlazedTerracottaHandler BlockPurpleGlazedTerracottaHandler(E_BLOCK_PURPLE_GLAZED_TERRACOTTA);
371  constexpr cDefaultBlockHandler BlockPurpleShulkerBoxHandler (E_BLOCK_PURPLE_SHULKER_BOX);
372  constexpr cDefaultBlockHandler BlockPurpurBlockHandler (E_BLOCK_PURPUR_BLOCK);
373  constexpr cBlockDoubleSlabHandler BlockPurpurDoubleSlabHandler (E_BLOCK_PURPUR_DOUBLE_SLAB);
374  constexpr cDefaultBlockHandler BlockPurpurPillarHandler (E_BLOCK_PURPUR_PILLAR);
375  constexpr cBlockSlabHandler BlockPurpurSlabHandler (E_BLOCK_PURPUR_SLAB);
376  constexpr cBlockStairsHandler BlockPurpurStairsHandler (E_BLOCK_PURPUR_STAIRS);
377  constexpr cBlockQuartzHandler BlockQuartzBlockHandler (E_BLOCK_QUARTZ_BLOCK);
378  constexpr cBlockStairsHandler BlockQuartzStairsHandler (E_BLOCK_QUARTZ_STAIRS);
379  constexpr cBlockRailHandler BlockRailHandler (E_BLOCK_RAIL);
380  constexpr cBlockGlazedTerracottaHandler BlockRedGlazedTerracottaHandler (E_BLOCK_RED_GLAZED_TERRACOTTA);
381  constexpr cBlockMushroomHandler BlockRedMushroomHandler (E_BLOCK_RED_MUSHROOM);
382  constexpr cDefaultBlockHandler BlockRedNetherBricksHandler (E_BLOCK_RED_NETHER_BRICK);
383  constexpr cBlockFlowerHandler BlockRedRoseHandler (E_BLOCK_RED_ROSE);
384  constexpr cDefaultBlockHandler BlockRedSandstoneHandler (E_BLOCK_RED_SANDSTONE);
385  constexpr cBlockSlabHandler BlockRedSandstoneSlabHandler (E_BLOCK_RED_SANDSTONE_SLAB);
386  constexpr cBlockStairsHandler BlockRedSandstoneStairsHandler (E_BLOCK_RED_SANDSTONE_STAIRS);
387  constexpr cDefaultBlockHandler BlockRedShulkerBoxHandler (E_BLOCK_RED_SHULKER_BOX);
388  constexpr cDefaultBlockHandler BlockRedstoneBlockHandler (E_BLOCK_BLOCK_OF_REDSTONE);
389  constexpr cBlockRedstoneLampHandler BlockRedstoneLampHandler (E_BLOCK_REDSTONE_LAMP_ON);
390  constexpr cBlockGlowingRedstoneOreHandler BlockRedstoneOreGlowingHandler (E_BLOCK_REDSTONE_ORE_GLOWING);
391  constexpr cBlockRedstoneOreHandler BlockRedstoneOreHandler (E_BLOCK_REDSTONE_ORE);
392  constexpr cBlockRedstoneRepeaterHandler BlockRedstoneRepeaterOffHandler (E_BLOCK_REDSTONE_REPEATER_OFF);
393  constexpr cBlockRedstoneRepeaterHandler BlockRedstoneRepeaterOnHandler (E_BLOCK_REDSTONE_REPEATER_ON);
394  constexpr cBlockRedstoneTorchHandler BlockRedstoneTorchOffHandler (E_BLOCK_REDSTONE_TORCH_OFF);
395  constexpr cBlockRedstoneTorchHandler BlockRedstoneTorchOnHandler (E_BLOCK_REDSTONE_TORCH_ON);
396  constexpr cBlockRedstoneWireHandler BlockRedstoneWireHandler (E_BLOCK_REDSTONE_WIRE);
397  constexpr cBlockCommandBlockHandler BlockRepeatingCommandBlockHandler (E_BLOCK_REPEATING_COMMAND_BLOCK);
398  constexpr cBlockSandHandler BlockSandHandler (E_BLOCK_SAND);
399  constexpr cDefaultBlockHandler BlockSandstoneHandler (E_BLOCK_SANDSTONE);
400  constexpr cBlockStairsHandler BlockSandstoneStairsHandler (E_BLOCK_SANDSTONE_STAIRS);
401  constexpr cBlockSaplingHandler BlockSaplingHandler (E_BLOCK_SAPLING);
402  constexpr cBlockSeaLanternHandler BlockSeaLanternHandler (E_BLOCK_SEA_LANTERN);
403  constexpr cBlockSignPostHandler BlockSignPostHandler (E_BLOCK_SIGN_POST);
404  constexpr cBlockSlimeHandler BlockSlimeBlockHandler (E_BLOCK_SLIME_BLOCK);
405  constexpr cDefaultBlockHandler BlockSnowBlockHandler (E_BLOCK_SNOW_BLOCK);
406  constexpr cBlockSnowHandler BlockSnowHandler (E_BLOCK_SNOW);
407  constexpr cDefaultBlockHandler BlockSoulSandHandler (E_BLOCK_SOULSAND);
408  constexpr cBlockSpongeHandler BlockSpongeHandler (E_BLOCK_SPONGE);
409  constexpr cBlockDoorHandler BlockSpruceDoorHandler (E_BLOCK_SPRUCE_DOOR);
410  constexpr cBlockFenceGateHandler BlockSpruceFenceGateHandler (E_BLOCK_SPRUCE_FENCE_GATE);
411  constexpr cBlockFenceHandler BlockSpruceFenceHandler (E_BLOCK_SPRUCE_FENCE);
412  constexpr cBlockStairsHandler BlockSpruceWoodStairsHandler (E_BLOCK_SPRUCE_WOOD_STAIRS);
413  constexpr cDefaultBlockHandler BlockStainedClayHandler (E_BLOCK_STAINED_CLAY);
414  constexpr cBlockGlassHandler BlockStainedGlassHandler (E_BLOCK_STAINED_GLASS);
415  constexpr cBlockGlassHandler BlockStainedGlassPaneHandler (E_BLOCK_STAINED_GLASS_PANE);
416  constexpr cBlockBannerHandler BlockStandingBannerHandler (E_BLOCK_STANDING_BANNER);
417  constexpr cBlockLavaHandler BlockStationaryLavaHandler (E_BLOCK_STATIONARY_LAVA);
418  constexpr cBlockWaterHandler BlockStationaryWaterHandler (E_BLOCK_STATIONARY_WATER);
419  constexpr cBlockPistonHandler BlockStickyPistonHandler (E_BLOCK_STICKY_PISTON);
420  constexpr cDefaultBlockHandler BlockStoneBricksHandler (E_BLOCK_STONE_BRICKS);
421  constexpr cBlockStairsHandler BlockStoneBrickStairsHandler (E_BLOCK_STONE_BRICK_STAIRS);
422  constexpr cBlockButtonHandler BlockStoneButtonHandler (E_BLOCK_STONE_BUTTON);
423  constexpr cBlockStoneHandler BlockStoneHandler (E_BLOCK_STONE);
424  constexpr cBlockPressurePlateHandler BlockStonePressurePlateHandler (E_BLOCK_STONE_PRESSURE_PLATE);
425  constexpr cBlockSlabHandler BlockStoneSlabHandler (E_BLOCK_STONE_SLAB);
426  constexpr cDefaultBlockHandler BlockStructureBlockHandler (E_BLOCK_STRUCTURE_BLOCK);
427  constexpr cDefaultBlockHandler BlockStructureVoidHandler (E_BLOCK_STRUCTURE_VOID);
428  constexpr cBlockSugarCaneHandler BlockSugarCaneHandler (E_BLOCK_SUGARCANE);
429  constexpr cBlockTallGrassHandler BlockTallGrassHandler (E_BLOCK_TALL_GRASS);
430  constexpr cBlockTNTHandler BlockTNTHandler (E_BLOCK_TNT);
431  constexpr cBlockTorchHandler BlockTorchHandler (E_BLOCK_TORCH);
432  constexpr cBlockTrapdoorHandler BlockTrapdoorHandler (E_BLOCK_TRAPDOOR);
433  constexpr cBlockChestHandler BlockTrappedChestHandler (E_BLOCK_TRAPPED_CHEST);
434  constexpr cBlockTripwireHandler BlockTripwireHandler (E_BLOCK_TRIPWIRE);
435  constexpr cBlockTripwireHookHandler BlockTripwireHookHandler (E_BLOCK_TRIPWIRE_HOOK);
436  constexpr cBlockVinesHandler BlockVinesHandler (E_BLOCK_VINES);
437  constexpr cBlockBannerHandler BlockWallBannerHandler (E_BLOCK_WALL_BANNER);
438  constexpr cBlockWallSignHandler BlockWallsignHandler (E_BLOCK_WALLSIGN);
439  constexpr cBlockWaterHandler BlockWaterHandler (E_BLOCK_WATER);
440  constexpr cBlockGlazedTerracottaHandler BlockWhiteGlazedTerracottaHandler (E_BLOCK_WHITE_GLAZED_TERRACOTTA);
441  constexpr cDefaultBlockHandler BlockWhiteShulkerBoxHandler (E_BLOCK_WHITE_SHULKER_BOX);
442  constexpr cBlockButtonHandler BlockWoodenButtonHandler (E_BLOCK_WOODEN_BUTTON);
443  constexpr cBlockPressurePlateHandler BlockWoodenPressurePlateHandler (E_BLOCK_WOODEN_PRESSURE_PLATE);
444  constexpr cBlockSlabHandler BlockWoodenSlabHandler (E_BLOCK_WOODEN_SLAB);
445  constexpr cBlockClothHandler BlockWoolHandler (E_BLOCK_WOOL);
446  constexpr cBlockWorkbenchHandler BlockWorkbenchHandler (E_BLOCK_WORKBENCH);
447  constexpr cBlockFlowerHandler BlockYellowFlowerHandler (E_BLOCK_YELLOW_FLOWER);
448  constexpr cBlockGlazedTerracottaHandler BlockYellowGlazedTerracottaHandler(E_BLOCK_YELLOW_GLAZED_TERRACOTTA);
449  constexpr cDefaultBlockHandler BlockYellowShulkerBoxHandler (E_BLOCK_YELLOW_SHULKER_BOX);
450 }
451 
452 
453 
454 
455 
457 // cBlockHandler:
458 
460  cChunkInterface & a_ChunkInterface,
461  cWorldInterface & a_WorldInterface,
462  cBlockPluginInterface & a_PluginInterface,
463  cChunk & a_Chunk,
464  const Vector3i a_RelPos
465 ) const
466 {
467 }
468 
469 
470 
471 
472 
473 void cBlockHandler::OnNeighborChanged(cChunkInterface & a_ChunkInterface, Vector3i a_BlockPos, eBlockFace a_WhichNeighbor) const
474 {
475  if (a_ChunkInterface.DoWithChunkAt(a_BlockPos, [&](cChunk & a_Chunk) { return CanBeAt(a_Chunk, cChunkDef::AbsoluteToRelative(a_BlockPos), a_Chunk.GetMeta(cChunkDef::AbsoluteToRelative(a_BlockPos))); }))
476  {
477  return;
478  }
479 
480  a_ChunkInterface.DropBlockAsPickups(a_BlockPos);
481 }
482 
483 
484 
485 
486 
487 void cBlockHandler::NeighborChanged(cChunkInterface & a_ChunkInterface, Vector3i a_NeighborPos, eBlockFace a_WhichNeighbor)
488 {
489  if (!cChunkDef::IsValidHeight(a_NeighborPos))
490  {
491  return;
492  }
493 
494  cBlockHandler::For(a_ChunkInterface.GetBlock(a_NeighborPos)).OnNeighborChanged(a_ChunkInterface, a_NeighborPos, a_WhichNeighbor);
495 }
496 
497 
498 
499 
500 
501 cItems cBlockHandler::ConvertToPickups(NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const
502 {
503  UNUSED(a_Tool);
504 
505  // Add self:
506  return cItem(m_BlockType, 1, a_BlockMeta);
507 }
508 
509 
510 
511 
512 
513 bool cBlockHandler::CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const
514 {
515  return true;
516 }
517 
518 
519 
520 
521 
523 {
524  return false;
525 }
526 
527 
528 
529 
530 
531 bool cBlockHandler::DoesIgnoreBuildCollision(const cWorld & a_World, const cItem & a_HeldItem, const Vector3i a_Position, const NIBBLETYPE a_Meta, const eBlockFace a_ClickedBlockFace, const bool a_ClickedDirectly) const
532 {
533  return m_BlockType == E_BLOCK_AIR;
534 }
535 
536 
537 
538 
539 
540 bool cBlockHandler::IsInsideBlock(const Vector3d a_RelPosition, const NIBBLETYPE a_BlockMeta) const
541 {
542  // Default functionality: Test the height, since we assume full voxels with varying height
543  return (a_RelPosition.y < cBlockInfo::GetBlockHeight(m_BlockType));
544 }
545 
546 
547 
548 
549 
551 {
553  {
554  // Non-solid things can be placed within entities
555  return cBoundingBox(0, 0, 0, 0, 0, 0);
556  }
557  return cBoundingBox(0, 1, 0, cBlockInfo::GetBlockHeight(m_BlockType), 0, 1);
558 }
559 
560 
561 
562 
563 
565  cChunkInterface & a_ChunkInterface, cBlockPluginInterface & a_PluginInterface,
566  Vector3i a_RelPos,
567  cChunk & a_Chunk
568 ) const
569 {
570  const auto Position = cChunkDef::RelativeToAbsolute(a_RelPos, a_Chunk.GetPos());
571  NeighborChanged(a_ChunkInterface, Position.addedX(-1), BLOCK_FACE_XP);
572  NeighborChanged(a_ChunkInterface, Position.addedX(1), BLOCK_FACE_XM);
573  NeighborChanged(a_ChunkInterface, Position.addedY(-1), BLOCK_FACE_YP);
574  NeighborChanged(a_ChunkInterface, Position.addedY(1), BLOCK_FACE_YM);
575  NeighborChanged(a_ChunkInterface, Position.addedZ(-1), BLOCK_FACE_ZP);
576  NeighborChanged(a_ChunkInterface, Position.addedZ(1), BLOCK_FACE_ZM);
577 }
578 
579 
580 
581 
582 
584 {
585  // Zero for transparent
586  return 0;
587 }
588 
589 
590 
591 
592 
594 {
595  return ((a_Tool != nullptr) && (a_Tool->m_Enchantments.GetLevel(cEnchantments::enchSilkTouch) > 0));
596 }
597 
598 
599 
600 
601 
602 unsigned char cBlockHandler::ToolFortuneLevel(const cItem * a_Tool)
603 {
604  if ((a_Tool != nullptr) && ItemCategory::IsTool(a_Tool->m_ItemType))
605  {
606  // Return enchantment level, limited to avoid spawning excessive pickups (crashing the server) when modified items are used:
607  return static_cast<unsigned char>(std::min(8U, a_Tool->m_Enchantments.GetLevel(cEnchantments::enchFortune)));
608  }
609 
610  // Not a tool:
611  return 0;
612 }
613 
614 
615 
616 
617 
618 char cBlockHandler::FortuneDiscreteRandom(char a_MinDrop, char a_DefaultMax, unsigned char a_BonusMax, char a_DropCap)
619 {
620  // First sample the discrete random distribution.
621  char DropNum = GetRandomProvider().RandInt<char>(a_MinDrop, static_cast<char>(a_DefaultMax + a_BonusMax));
622 
623  // Then clamp to within range (clamp instead of min incase of overflow):
624  return std::clamp<char>(DropNum, a_MinDrop, a_DropCap);
625 }
626 
627 
628 
629 
630 
632 {
633  // Switch on the block type, as an enumeration
634  // Clang will fail if any type is unhandled:
635  switch (static_cast<ENUM_BLOCK_TYPE>(a_BlockType))
636  {
637  // Block handlers, alphabetically sorted:
638  case E_BLOCK_ACACIA_DOOR: return BlockAcaciaDoorHandler;
639  case E_BLOCK_ACACIA_FENCE: return BlockAcaciaFenceHandler;
640  case E_BLOCK_ACACIA_FENCE_GATE: return BlockAcaciaFenceGateHandler;
641  case E_BLOCK_ACACIA_WOOD_STAIRS: return BlockAcaciaWoodStairsHandler;
642  case E_BLOCK_ACTIVATOR_RAIL: return BlockActivatorRailHandler;
643  case E_BLOCK_ACTIVE_COMPARATOR: return BlockActiveComparatorHandler;
644  case E_BLOCK_AIR: return BlockAirHandler;
645  case E_BLOCK_ANVIL: return BlockAnvilHandler;
646  case E_BLOCK_BARRIER: return BlockBarrierHandler;
647  case E_BLOCK_BEACON: return BlockBeaconHandler;
648  case E_BLOCK_BED: return BlockBedHandler;
649  case E_BLOCK_BEDROCK: return BlockBedrockHandler;
650  case E_BLOCK_BEETROOTS: return BlockBeetrootsHandler;
651  case E_BLOCK_BIG_FLOWER: return BlockBigFlowerHandler;
652  case E_BLOCK_BIRCH_DOOR: return BlockBirchDoorHandler;
653  case E_BLOCK_BIRCH_FENCE: return BlockBirchFenceHandler;
654  case E_BLOCK_BIRCH_FENCE_GATE: return BlockBirchFenceGateHandler;
655  case E_BLOCK_BIRCH_WOOD_STAIRS: return BlockBirchWoodStairsHandler;
656  case E_BLOCK_BLACK_GLAZED_TERRACOTTA: return BlockBlackGlazedTerracottaHandler;
657  case E_BLOCK_BLACK_SHULKER_BOX: return BlockBlackShulkerBoxHandler;
658  case E_BLOCK_BLOCK_OF_COAL: return BlockCoalBlockHandler;
659  case E_BLOCK_BLOCK_OF_REDSTONE: return BlockRedstoneBlockHandler;
660  case E_BLOCK_BLUE_GLAZED_TERRACOTTA: return BlockBlueGlazedTerracottaHandler;
661  case E_BLOCK_BLUE_SHULKER_BOX: return BlockBlueShulkerBoxHandler;
662  case E_BLOCK_BONE_BLOCK: return BlockBoneBlockHandler;
663  case E_BLOCK_BOOKCASE: return BlockBookcaseHandler;
664  case E_BLOCK_BREWING_STAND: return BlockBrewingStandHandler;
665  case E_BLOCK_BRICK: return BlockBricksHandler;
666  case E_BLOCK_BRICK_STAIRS: return BlockBrickStairsHandler;
667  case E_BLOCK_BROWN_GLAZED_TERRACOTTA: return BlockBrownGlazedTerracottaHandler;
668  case E_BLOCK_BROWN_MUSHROOM: return BlockBrownMushroomHandler;
669  case E_BLOCK_BROWN_SHULKER_BOX: return BlockBrownShulkerBoxHandler;
670  case E_BLOCK_CACTUS: return BlockCactusHandler;
671  case E_BLOCK_CAKE: return BlockCakeHandler;
672  case E_BLOCK_CARPET: return BlockCarpetHandler;
673  case E_BLOCK_CARROTS: return BlockCarrotsHandler;
674  case E_BLOCK_CAULDRON: return BlockCauldronHandler;
675  case E_BLOCK_CHAIN_COMMAND_BLOCK: return BlockChainCommandBlockHandler;
676  case E_BLOCK_CHEST: return BlockChestHandler;
677  case E_BLOCK_CHORUS_FLOWER: return BlockChorusFlowerHandler;
678  case E_BLOCK_CHORUS_PLANT: return BlockChorusPlantHandler;
679  case E_BLOCK_CLAY: return BlockClayHandler;
680  case E_BLOCK_COAL_ORE: return BlockCoalOreHandler;
681  case E_BLOCK_COBBLESTONE: return BlockCobblestoneHandler;
682  case E_BLOCK_COBBLESTONE_STAIRS: return BlockCobblestoneStairsHandler;
683  case E_BLOCK_COBBLESTONE_WALL: return BlockCobblestoneWallHandler;
684  case E_BLOCK_COBWEB: return BlockCobwebHandler;
685  case E_BLOCK_COCOA_POD: return BlockCocoaPodHandler;
686  case E_BLOCK_COMMAND_BLOCK: return BlockCommandBlockHandler;
687  case E_BLOCK_CONCRETE: return BlockConcreteHandler;
688  case E_BLOCK_CONCRETE_POWDER: return BlockConcretePowderHandler;
689  case E_BLOCK_CROPS: return BlockCropsHandler;
690  case E_BLOCK_CYAN_GLAZED_TERRACOTTA: return BlockCyanGlazedTerracottaHandler;
691  case E_BLOCK_CYAN_SHULKER_BOX: return BlockCyanShulkerBoxHandler;
692  case E_BLOCK_DARK_OAK_DOOR: return BlockDarkOakDoorHandler;
693  case E_BLOCK_DARK_OAK_FENCE: return BlockDarkOakFenceHandler;
694  case E_BLOCK_DARK_OAK_FENCE_GATE: return BlockDarkOakFenceGateHandler;
695  case E_BLOCK_DARK_OAK_WOOD_STAIRS: return BlockDarkOakWoodStairsHandler;
696  case E_BLOCK_DAYLIGHT_SENSOR: return BlockDaylightSensorHandler;
697  case E_BLOCK_DEAD_BUSH: return BlockDeadBushHandler;
698  case E_BLOCK_DETECTOR_RAIL: return BlockDetectorRailHandler;
699  case E_BLOCK_DIAMOND_BLOCK: return BlockDiamondBlockHandler;
700  case E_BLOCK_DIAMOND_ORE: return BlockDiamondOreHandler;
701  case E_BLOCK_DIRT: return BlockDirtHandler;
702  case E_BLOCK_DISPENSER: return BlockDispenserHandler;
703  case E_BLOCK_DOUBLE_RED_SANDSTONE_SLAB: return BlockDoubleRedSandstoneSlabHandler;
704  case E_BLOCK_DOUBLE_STONE_SLAB: return BlockDoubleStoneSlabHandler;
705  case E_BLOCK_DOUBLE_WOODEN_SLAB: return BlockDoubleWoodenSlabHandler;
706  case E_BLOCK_DRAGON_EGG: return BlockDragonEggHandler;
707  case E_BLOCK_DROPPER: return BlockDropperHandler;
708  case E_BLOCK_EMERALD_BLOCK: return BlockEmeraldBlockHandler;
709  case E_BLOCK_EMERALD_ORE: return BlockEmeraldOreHandler;
710  case E_BLOCK_ENCHANTMENT_TABLE: return BlockEnchantingTableHandler;
711  case E_BLOCK_ENDER_CHEST: return BlockEnderChestHandler;
712  case E_BLOCK_END_BRICKS: return BlockEndBricksHandler;
713  case E_BLOCK_END_GATEWAY: return BlockEndGatewayHandler;
714  case E_BLOCK_END_PORTAL: return BlockEndPortalHandler;
715  case E_BLOCK_END_PORTAL_FRAME: return BlockEndPortalFrameHandler;
716  case E_BLOCK_END_ROD: return BlockEndRodHandler;
717  case E_BLOCK_END_STONE: return BlockEndStoneHandler;
718  case E_BLOCK_FARMLAND: return BlockFarmlandHandler;
719  case E_BLOCK_FENCE: return BlockFenceHandler;
720  case E_BLOCK_FIRE: return BlockFireHandler;
721  case E_BLOCK_FLOWER_POT: return BlockFlowerPotHandler;
722  case E_BLOCK_FROSTED_ICE: return BlockFrostedIceHandler;
723  case E_BLOCK_FURNACE: return BlockFurnaceHandler;
724  case E_BLOCK_GLASS: return BlockGlassHandler;
725  case E_BLOCK_GLASS_PANE: return BlockGlassPaneHandler;
726  case E_BLOCK_GLOWSTONE: return BlockGlowstoneHandler;
727  case E_BLOCK_GOLD_BLOCK: return BlockGoldBlockHandler;
728  case E_BLOCK_GOLD_ORE: return BlockGoldOreHandler;
729  case E_BLOCK_GRASS: return BlockGrassHandler;
730  case E_BLOCK_GRASS_PATH: return BlockGrassPathHandler;
731  case E_BLOCK_GRAVEL: return BlockGravelHandler;
732  case E_BLOCK_GRAY_GLAZED_TERRACOTTA: return BlockGrayGlazedTerracottaHandler;
733  case E_BLOCK_GRAY_SHULKER_BOX: return BlockGrayShulkerBoxHandler;
734  case E_BLOCK_GREEN_GLAZED_TERRACOTTA: return BlockGreenGlazedTerracottaHandler;
735  case E_BLOCK_GREEN_SHULKER_BOX: return BlockGreenShulkerBoxHandler;
736  case E_BLOCK_HARDENED_CLAY: return BlockHardenedClayHandler;
737  case E_BLOCK_HAY_BALE: return BlockHayBaleHandler;
738  case E_BLOCK_HEAD: return BlockHeadHandler;
739  case E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE: return BlockHeavyWeightedPressurePHandler;
740  case E_BLOCK_HOPPER: return BlockHopperHandler;
741  case E_BLOCK_HUGE_BROWN_MUSHROOM: return BlockHugeBrownMushroomHandler;
742  case E_BLOCK_HUGE_RED_MUSHROOM: return BlockHugeRedMushroomHandler;
743  case E_BLOCK_ICE: return BlockIceHandler;
744  case E_BLOCK_INACTIVE_COMPARATOR: return BlockInactiveComparatorHandler;
745  case E_BLOCK_INVERTED_DAYLIGHT_SENSOR: return BlockDaylightSensorHandler;
746  case E_BLOCK_IRON_BARS: return BlockIronBarsHandler;
747  case E_BLOCK_IRON_BLOCK: return BlockIronBlockHandler;
748  case E_BLOCK_IRON_DOOR: return BlockIronDoorHandler;
749  case E_BLOCK_IRON_ORE: return BlockIronOreHandler;
750  case E_BLOCK_IRON_TRAPDOOR: return BlockIronTrapdoorHandler;
751  case E_BLOCK_JACK_O_LANTERN: return BlockJackOLanternHandler;
752  case E_BLOCK_JUKEBOX: return BlockJukeboxHandler;
753  case E_BLOCK_JUNGLE_DOOR: return BlockJungleDoorHandler;
754  case E_BLOCK_JUNGLE_FENCE: return BlockJungleFenceHandler;
755  case E_BLOCK_JUNGLE_FENCE_GATE: return BlockJungleFenceGateHandler;
756  case E_BLOCK_JUNGLE_WOOD_STAIRS: return BlockJungleWoodStairsHandler;
757  case E_BLOCK_LADDER: return BlockLadderHandler;
758  case E_BLOCK_LAPIS_BLOCK: return BlockLapisBlockHandler;
759  case E_BLOCK_LAPIS_ORE: return BlockLapisOreHandler;
760  case E_BLOCK_LAVA: return BlockLavaHandler;
761  case E_BLOCK_LEAVES: return BlockLeavesHandler;
762  case E_BLOCK_LEVER: return BlockLeverHandler;
763  case E_BLOCK_LIGHT_BLUE_GLAZED_TERRACOTTA: return BlockLightBlueGlazedTerracoHandler;
764  case E_BLOCK_LIGHT_BLUE_SHULKER_BOX: return BlockLightBlueShulkerBoxHandler;
765  case E_BLOCK_LIGHT_GRAY_GLAZED_TERRACOTTA: return BlockLightGrayGlazedTerracoHandler;
766  case E_BLOCK_LIGHT_GRAY_SHULKER_BOX: return BlockLightGrayShulkerBoxHandler;
767  case E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE: return BlockLightWeightedPressurePHandler;
768  case E_BLOCK_LILY_PAD: return BlockLilyPadHandler;
769  case E_BLOCK_LIME_GLAZED_TERRACOTTA: return BlockLimeGlazedTerracottaHandler;
770  case E_BLOCK_LIME_SHULKER_BOX: return BlockLimeShulkerBoxHandler;
771  case E_BLOCK_LIT_FURNACE: return BlockLitFurnaceHandler;
772  case E_BLOCK_LOG: return BlockLogHandler;
773  case E_BLOCK_MAGENTA_GLAZED_TERRACOTTA: return BlockMagentaGlazedTerracottHandler;
774  case E_BLOCK_MAGENTA_SHULKER_BOX: return BlockMagentaShulkerBoxHandler;
775  case E_BLOCK_MAGMA: return BlockMagmaHandler;
776  case E_BLOCK_MELON: return BlockMelonHandler;
777  case E_BLOCK_MELON_STEM: return BlockMelonStemHandler;
778  case E_BLOCK_MOB_SPAWNER: return BlockMobSpawnerHandler;
779  case E_BLOCK_MOSSY_COBBLESTONE: return BlockMossyCobblestoneHandler;
780  case E_BLOCK_MYCELIUM: return BlockMyceliumHandler;
781  case E_BLOCK_NETHERRACK: return BlockNetherrackHandler;
782  case E_BLOCK_NETHER_BRICK: return BlockNetherBricksHandler;
783  case E_BLOCK_NETHER_BRICK_FENCE: return BlockNetherBrickFenceHandler;
784  case E_BLOCK_NETHER_BRICK_STAIRS: return BlockNetherBrickStairsHandler;
785  case E_BLOCK_NETHER_PORTAL: return BlockNetherPortalHandler;
786  case E_BLOCK_NETHER_QUARTZ_ORE: return BlockNetherQuartzOreHandler;
787  case E_BLOCK_NETHER_WART: return BlockNetherWartHandler;
788  case E_BLOCK_NETHER_WART_BLOCK: return BlockNetherWartBlockHandler;
789  case E_BLOCK_NEW_LEAVES: return BlockNewLeavesHandler;
790  case E_BLOCK_NEW_LOG: return BlockNewLogHandler;
791  case E_BLOCK_NOTE_BLOCK: return BlockNoteBlockHandler;
792  case E_BLOCK_OAK_DOOR: return BlockOakDoorHandler;
793  case E_BLOCK_OAK_FENCE_GATE: return BlockOakFenceGateHandler;
794  case E_BLOCK_OAK_WOOD_STAIRS: return BlockOakWoodStairsHandler;
795  case E_BLOCK_OBSERVER: return BlockObserverHandler;
796  case E_BLOCK_OBSIDIAN: return BlockObsidianHandler;
797  case E_BLOCK_ORANGE_GLAZED_TERRACOTTA: return BlockOrangeGlazedTerracottaHandler;
798  case E_BLOCK_ORANGE_SHULKER_BOX: return BlockOrangeShulkerBoxHandler;
799  case E_BLOCK_PACKED_ICE: return BlockPackedIceHandler;
800  case E_BLOCK_PINK_GLAZED_TERRACOTTA: return BlockPinkGlazedTerracottaHandler;
801  case E_BLOCK_PINK_SHULKER_BOX: return BlockPinkShulkerBoxHandler;
802  case E_BLOCK_PISTON: return BlockPistonHandler;
803  case E_BLOCK_PISTON_EXTENSION: return BlockPistonHeadHandler;
804  case E_BLOCK_PISTON_MOVED_BLOCK: return BlockPistonMovedBlockHandler;
805  case E_BLOCK_PLANKS: return BlockPlanksHandler;
806  case E_BLOCK_POTATOES: return BlockPotatoesHandler;
807  case E_BLOCK_POWERED_RAIL: return BlockPoweredRailHandler;
808  case E_BLOCK_PRISMARINE_BLOCK: return BlockPrismarineBlockHandler;
809  case E_BLOCK_PUMPKIN: return BlockPumpkinHandler;
810  case E_BLOCK_PUMPKIN_STEM: return BlockPumpkinStemHandler;
811  case E_BLOCK_PURPLE_GLAZED_TERRACOTTA: return BlockPurpleGlazedTerracottaHandler;
812  case E_BLOCK_PURPLE_SHULKER_BOX: return BlockPurpleShulkerBoxHandler;
813  case E_BLOCK_PURPUR_BLOCK: return BlockPurpurBlockHandler;
814  case E_BLOCK_PURPUR_DOUBLE_SLAB: return BlockPurpurDoubleSlabHandler;
815  case E_BLOCK_PURPUR_PILLAR: return BlockPurpurPillarHandler;
816  case E_BLOCK_PURPUR_SLAB: return BlockPurpurSlabHandler;
817  case E_BLOCK_PURPUR_STAIRS: return BlockPurpurStairsHandler;
818  case E_BLOCK_QUARTZ_BLOCK: return BlockQuartzBlockHandler;
819  case E_BLOCK_QUARTZ_STAIRS: return BlockQuartzStairsHandler;
820  case E_BLOCK_RAIL: return BlockRailHandler;
821  case E_BLOCK_REDSTONE_LAMP_OFF: return BlockRedstoneLampHandler;
822  case E_BLOCK_REDSTONE_LAMP_ON: return BlockRedstoneLampHandler;
823  case E_BLOCK_REDSTONE_ORE: return BlockRedstoneOreHandler;
824  case E_BLOCK_REDSTONE_ORE_GLOWING: return BlockRedstoneOreGlowingHandler;
825  case E_BLOCK_REDSTONE_REPEATER_OFF: return BlockRedstoneRepeaterOffHandler;
826  case E_BLOCK_REDSTONE_REPEATER_ON: return BlockRedstoneRepeaterOnHandler;
827  case E_BLOCK_REDSTONE_TORCH_OFF: return BlockRedstoneTorchOffHandler;
828  case E_BLOCK_REDSTONE_TORCH_ON: return BlockRedstoneTorchOnHandler;
829  case E_BLOCK_REDSTONE_WIRE: return BlockRedstoneWireHandler;
830  case E_BLOCK_RED_GLAZED_TERRACOTTA: return BlockRedGlazedTerracottaHandler;
831  case E_BLOCK_RED_MUSHROOM: return BlockRedMushroomHandler;
832  case E_BLOCK_RED_NETHER_BRICK: return BlockRedNetherBricksHandler;
833  case E_BLOCK_RED_ROSE: return BlockRedRoseHandler;
834  case E_BLOCK_RED_SANDSTONE: return BlockRedSandstoneHandler;
835  case E_BLOCK_RED_SANDSTONE_SLAB: return BlockRedSandstoneSlabHandler;
836  case E_BLOCK_RED_SANDSTONE_STAIRS: return BlockRedSandstoneStairsHandler;
837  case E_BLOCK_RED_SHULKER_BOX: return BlockRedShulkerBoxHandler;
838  case E_BLOCK_REPEATING_COMMAND_BLOCK: return BlockRepeatingCommandBlockHandler;
839  case E_BLOCK_SAND: return BlockSandHandler;
840  case E_BLOCK_SANDSTONE: return BlockSandstoneHandler;
841  case E_BLOCK_SANDSTONE_STAIRS: return BlockSandstoneStairsHandler;
842  case E_BLOCK_SAPLING: return BlockSaplingHandler;
843  case E_BLOCK_SEA_LANTERN: return BlockSeaLanternHandler;
844  case E_BLOCK_SIGN_POST: return BlockSignPostHandler;
845  case E_BLOCK_SILVERFISH_EGG: return BlockInfestedBlockHandler;
846  case E_BLOCK_SLIME_BLOCK: return BlockSlimeBlockHandler;
847  case E_BLOCK_SNOW: return BlockSnowHandler;
848  case E_BLOCK_SNOW_BLOCK: return BlockSnowBlockHandler;
849  case E_BLOCK_SOULSAND: return BlockSoulSandHandler;
850  case E_BLOCK_SPONGE: return BlockSpongeHandler;
851  case E_BLOCK_SPRUCE_DOOR: return BlockSpruceDoorHandler;
852  case E_BLOCK_SPRUCE_FENCE: return BlockSpruceFenceHandler;
853  case E_BLOCK_SPRUCE_FENCE_GATE: return BlockSpruceFenceGateHandler;
854  case E_BLOCK_SPRUCE_WOOD_STAIRS: return BlockSpruceWoodStairsHandler;
855  case E_BLOCK_STAINED_CLAY: return BlockStainedClayHandler;
856  case E_BLOCK_STAINED_GLASS: return BlockStainedGlassHandler;
857  case E_BLOCK_STAINED_GLASS_PANE: return BlockStainedGlassPaneHandler;
858  case E_BLOCK_STANDING_BANNER: return BlockStandingBannerHandler;
859  case E_BLOCK_STATIONARY_LAVA: return BlockStationaryLavaHandler;
860  case E_BLOCK_STATIONARY_WATER: return BlockStationaryWaterHandler;
861  case E_BLOCK_STICKY_PISTON: return BlockStickyPistonHandler;
862  case E_BLOCK_STONE: return BlockStoneHandler;
863  case E_BLOCK_STONE_BRICKS: return BlockStoneBricksHandler;
864  case E_BLOCK_STONE_BRICK_STAIRS: return BlockStoneBrickStairsHandler;
865  case E_BLOCK_STONE_BUTTON: return BlockStoneButtonHandler;
866  case E_BLOCK_STONE_PRESSURE_PLATE: return BlockStonePressurePlateHandler;
867  case E_BLOCK_STONE_SLAB: return BlockStoneSlabHandler;
868  case E_BLOCK_STRUCTURE_BLOCK: return BlockStructureBlockHandler;
869  case E_BLOCK_STRUCTURE_VOID: return BlockStructureVoidHandler;
870  case E_BLOCK_SUGARCANE: return BlockSugarCaneHandler;
871  case E_BLOCK_TALL_GRASS: return BlockTallGrassHandler;
872  case E_BLOCK_TNT: return BlockTNTHandler;
873  case E_BLOCK_TORCH: return BlockTorchHandler;
874  case E_BLOCK_TRAPDOOR: return BlockTrapdoorHandler;
875  case E_BLOCK_TRAPPED_CHEST: return BlockTrappedChestHandler;
876  case E_BLOCK_TRIPWIRE: return BlockTripwireHandler;
877  case E_BLOCK_TRIPWIRE_HOOK: return BlockTripwireHookHandler;
878  case E_BLOCK_VINES: return BlockVinesHandler;
879  case E_BLOCK_WALLSIGN: return BlockWallsignHandler;
880  case E_BLOCK_WALL_BANNER: return BlockWallBannerHandler;
881  case E_BLOCK_WATER: return BlockWaterHandler;
882  case E_BLOCK_WHITE_GLAZED_TERRACOTTA: return BlockWhiteGlazedTerracottaHandler;
883  case E_BLOCK_WHITE_SHULKER_BOX: return BlockWhiteShulkerBoxHandler;
884  case E_BLOCK_WOODEN_BUTTON: return BlockWoodenButtonHandler;
885  case E_BLOCK_WOODEN_PRESSURE_PLATE: return BlockWoodenPressurePlateHandler;
886  case E_BLOCK_WOODEN_SLAB: return BlockWoodenSlabHandler;
887  case E_BLOCK_WOOL: return BlockWoolHandler;
888  case E_BLOCK_WORKBENCH: return BlockWorkbenchHandler;
889  case E_BLOCK_YELLOW_FLOWER: return BlockYellowFlowerHandler;
890  case E_BLOCK_YELLOW_GLAZED_TERRACOTTA: return BlockYellowGlazedTerracottaHandler;
891  case E_BLOCK_YELLOW_SHULKER_BOX: return BlockYellowShulkerBoxHandler;
892 
893  // TODO: these will be removed in 1.13+ migration
895  case E_BLOCK_UNFINISHED: return BlockAirHandler;
896  }
897  UNREACHABLE("Getting handler for unexpected block type");
898 }
ENUM_BLOCK_TYPE
Definition: BlockType.h:9
@ E_BLOCK_ORANGE_GLAZED_TERRACOTTA
Definition: BlockType.h:255
@ E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE
Definition: BlockType.h:163
@ E_BLOCK_REDSTONE_LAMP_OFF
Definition: BlockType.h:138
@ E_BLOCK_WOODEN_BUTTON
Definition: BlockType.h:158
@ E_BLOCK_STAINED_GLASS
Definition: BlockType.h:110
@ E_BLOCK_WHITE_SHULKER_BOX
Definition: BlockType.h:238
@ E_BLOCK_NETHER_BRICK_STAIRS
Definition: BlockType.h:129
@ E_BLOCK_NEW_LEAVES
Definition: BlockType.h:180
@ E_BLOCK_PINK_SHULKER_BOX
Definition: BlockType.h:244
@ E_BLOCK_SPONGE
Definition: BlockType.h:29
@ E_BLOCK_PINK_GLAZED_TERRACOTTA
Definition: BlockType.h:260
@ E_BLOCK_CARROTS
Definition: BlockType.h:156
@ E_BLOCK_REDSTONE_TORCH_ON
Definition: BlockType.h:90
@ E_BLOCK_STONE_PRESSURE_PLATE
Definition: BlockType.h:84
@ E_BLOCK_BLUE_SHULKER_BOX
Definition: BlockType.h:249
@ E_BLOCK_POTATOES
Definition: BlockType.h:157
@ E_BLOCK_GRAY_GLAZED_TERRACOTTA
Definition: BlockType.h:261
@ E_BLOCK_DEAD_BUSH
Definition: BlockType.h:42
@ E_BLOCK_HEAD
Definition: BlockType.h:159
@ E_BLOCK_MELON_STEM
Definition: BlockType.h:120
@ E_BLOCK_OAK_WOOD_STAIRS
Definition: BlockType.h:63
@ E_BLOCK_STANDING_BANNER
Definition: BlockType.h:195
@ E_BLOCK_PURPUR_BLOCK
Definition: BlockType.h:220
@ E_BLOCK_CLAY
Definition: BlockType.h:96
@ E_BLOCK_DARK_OAK_FENCE
Definition: BlockType.h:210
@ E_BLOCK_DAYLIGHT_SENSOR
Definition: BlockType.h:167
@ E_BLOCK_COCOA_POD
Definition: BlockType.h:142
@ E_BLOCK_REDSTONE_REPEATER_ON
Definition: BlockType.h:109
@ E_BLOCK_BREWING_STAND
Definition: BlockType.h:132
@ E_BLOCK_PURPUR_STAIRS
Definition: BlockType.h:222
@ E_BLOCK_UNFINISHED
Definition: BlockType.h:280
@ E_BLOCK_STICKY_PISTON
Definition: BlockType.h:39
@ E_BLOCK_JACK_O_LANTERN
Definition: BlockType.h:106
@ E_BLOCK_NETHER_PORTAL
Definition: BlockType.h:105
@ E_BLOCK_JUKEBOX
Definition: BlockType.h:99
@ E_BLOCK_BROWN_SHULKER_BOX
Definition: BlockType.h:250
@ E_BLOCK_BONE_BLOCK
Definition: BlockType.h:235
@ E_BLOCK_DOUBLE_WOODEN_SLAB
Definition: BlockType.h:140
@ E_BLOCK_DRAGON_EGG
Definition: BlockType.h:137
@ E_BLOCK_COBBLESTONE_STAIRS
Definition: BlockType.h:81
@ E_BLOCK_DIAMOND_BLOCK
Definition: BlockType.h:67
@ E_BLOCK_WATER
Definition: BlockType.h:18
@ E_BLOCK_TRAPDOOR
Definition: BlockType.h:111
@ E_BLOCK_GRASS_PATH
Definition: BlockType.h:227
@ E_BLOCK_ACTIVATOR_RAIL
Definition: BlockType.h:174
@ E_BLOCK_CHORUS_PLANT
Definition: BlockType.h:218
@ E_BLOCK_STATIONARY_LAVA
Definition: BlockType.h:21
@ E_BLOCK_LIGHT_BLUE_SHULKER_BOX
Definition: BlockType.h:241
@ E_BLOCK_REDSTONE_ORE
Definition: BlockType.h:87
@ E_BLOCK_COAL_ORE
Definition: BlockType.h:26
@ E_BLOCK_SLIME_BLOCK
Definition: BlockType.h:184
@ E_BLOCK_BIRCH_FENCE_GATE
Definition: BlockType.h:203
@ E_BLOCK_DARK_OAK_WOOD_STAIRS
Definition: BlockType.h:183
@ E_BLOCK_FARMLAND
Definition: BlockType.h:72
@ E_BLOCK_REPEATING_COMMAND_BLOCK
Definition: BlockType.h:229
@ E_BLOCK_BLACK_GLAZED_TERRACOTTA
Definition: BlockType.h:269
@ E_BLOCK_DIAMOND_ORE
Definition: BlockType.h:66
@ E_BLOCK_BRICK_STAIRS
Definition: BlockType.h:123
@ E_BLOCK_ACACIA_FENCE_GATE
Definition: BlockType.h:206
@ E_BLOCK_CAULDRON
Definition: BlockType.h:133
@ E_BLOCK_BRICK
Definition: BlockType.h:55
@ E_BLOCK_STONE_BRICK_STAIRS
Definition: BlockType.h:124
@ E_BLOCK_AIR
Definition: BlockType.h:10
@ E_BLOCK_WOOL
Definition: BlockType.h:45
@ E_BLOCK_CHORUS_FLOWER
Definition: BlockType.h:219
@ E_BLOCK_ENCHANTMENT_TABLE
Definition: BlockType.h:131
@ E_BLOCK_STRUCTURE_VOID
Definition: BlockType.h:236
@ E_BLOCK_LILY_PAD
Definition: BlockType.h:126
@ E_BLOCK_FURNACE
Definition: BlockType.h:73
@ E_BLOCK_SIGN_POST
Definition: BlockType.h:76
@ E_BLOCK_END_PORTAL_FRAME
Definition: BlockType.h:135
@ E_BLOCK_CROPS
Definition: BlockType.h:71
@ E_BLOCK_PRISMARINE_BLOCK
Definition: BlockType.h:187
@ E_BLOCK_GOLD_BLOCK
Definition: BlockType.h:51
@ E_BLOCK_RED_NETHER_BRICK
Definition: BlockType.h:234
@ E_BLOCK_NUMBER_OF_TYPES
Number of individual (different) blocktypes.
Definition: BlockType.h:277
@ E_BLOCK_BLOCK_OF_REDSTONE
Definition: BlockType.h:168
@ E_BLOCK_LEAVES
Definition: BlockType.h:28
@ E_BLOCK_OAK_FENCE_GATE
Definition: BlockType.h:122
@ E_BLOCK_STONE_BRICKS
Definition: BlockType.h:113
@ E_BLOCK_PURPUR_PILLAR
Definition: BlockType.h:221
@ E_BLOCK_MOSSY_COBBLESTONE
Definition: BlockType.h:58
@ E_BLOCK_OBSERVER
Definition: BlockType.h:237
@ E_BLOCK_STAINED_GLASS_PANE
Definition: BlockType.h:179
@ E_BLOCK_BEACON
Definition: BlockType.h:153
@ E_BLOCK_SPRUCE_DOOR
Definition: BlockType.h:212
@ E_BLOCK_CARPET
Definition: BlockType.h:190
@ E_BLOCK_MAGENTA_SHULKER_BOX
Definition: BlockType.h:240
@ E_BLOCK_REDSTONE_ORE_GLOWING
Definition: BlockType.h:88
@ E_BLOCK_BLUE_GLAZED_TERRACOTTA
Definition: BlockType.h:265
@ E_BLOCK_BIRCH_WOOD_STAIRS
Definition: BlockType.h:150
@ E_BLOCK_CYAN_SHULKER_BOX
Definition: BlockType.h:247
@ E_BLOCK_FIRE
Definition: BlockType.h:61
@ E_BLOCK_TNT
Definition: BlockType.h:56
@ E_BLOCK_LIME_SHULKER_BOX
Definition: BlockType.h:243
@ E_BLOCK_LAPIS_ORE
Definition: BlockType.h:31
@ E_BLOCK_CHAIN_COMMAND_BLOCK
Definition: BlockType.h:230
@ E_BLOCK_IRON_BLOCK
Definition: BlockType.h:52
@ E_BLOCK_NETHER_WART_BLOCK
Definition: BlockType.h:233
@ E_BLOCK_PURPLE_SHULKER_BOX
Definition: BlockType.h:248
@ E_BLOCK_PISTON_EXTENSION
Definition: BlockType.h:44
@ E_BLOCK_CONCRETE
Definition: BlockType.h:270
@ E_BLOCK_END_ROD
Definition: BlockType.h:217
@ E_BLOCK_CHEST
Definition: BlockType.h:64
@ E_BLOCK_COBWEB
Definition: BlockType.h:40
@ E_BLOCK_DOUBLE_RED_SANDSTONE_SLAB
Definition: BlockType.h:200
@ E_BLOCK_END_BRICKS
Definition: BlockType.h:225
@ E_BLOCK_BIRCH_DOOR
Definition: BlockType.h:213
@ E_BLOCK_CAKE
Definition: BlockType.h:107
@ E_BLOCK_BLOCK_OF_COAL
Definition: BlockType.h:192
@ E_BLOCK_JUNGLE_WOOD_STAIRS
Definition: BlockType.h:151
@ E_BLOCK_LIT_FURNACE
Definition: BlockType.h:74
@ E_BLOCK_LAPIS_BLOCK
Definition: BlockType.h:32
@ E_BLOCK_IRON_DOOR
Definition: BlockType.h:85
@ E_BLOCK_FENCE
Definition: BlockType.h:100
@ E_BLOCK_YELLOW_GLAZED_TERRACOTTA
Definition: BlockType.h:258
@ E_BLOCK_GRASS
Definition: BlockType.h:12
@ E_BLOCK_WORKBENCH
Definition: BlockType.h:69
@ E_BLOCK_MAGENTA_GLAZED_TERRACOTTA
Definition: BlockType.h:256
@ E_BLOCK_STONE_SLAB
Definition: BlockType.h:54
@ E_BLOCK_ACACIA_WOOD_STAIRS
Definition: BlockType.h:182
@ E_BLOCK_EMERALD_ORE
Definition: BlockType.h:144
@ E_BLOCK_ORANGE_SHULKER_BOX
Definition: BlockType.h:239
@ E_BLOCK_CACTUS
Definition: BlockType.h:95
@ E_BLOCK_CYAN_GLAZED_TERRACOTTA
Definition: BlockType.h:263
@ E_BLOCK_GLASS_PANE
Definition: BlockType.h:117
@ E_BLOCK_ICE
Definition: BlockType.h:93
@ E_BLOCK_BEETROOTS
Definition: BlockType.h:226
@ E_BLOCK_BEDROCK
Definition: BlockType.h:17
@ E_BLOCK_MELON
Definition: BlockType.h:118
@ E_BLOCK_NETHER_WART
Definition: BlockType.h:130
@ E_BLOCK_LEVER
Definition: BlockType.h:83
@ E_BLOCK_INACTIVE_COMPARATOR
Definition: BlockType.h:165
@ E_BLOCK_SILVERFISH_EGG
Definition: BlockType.h:112
@ E_BLOCK_DOUBLE_STONE_SLAB
Definition: BlockType.h:53
@ E_BLOCK_JUNGLE_DOOR
Definition: BlockType.h:214
@ E_BLOCK_PACKED_ICE
Definition: BlockType.h:193
@ E_BLOCK_TRIPWIRE
Definition: BlockType.h:147
@ E_BLOCK_POWERED_RAIL
Definition: BlockType.h:37
@ E_BLOCK_NEW_LOG
Definition: BlockType.h:181
@ E_BLOCK_OBSIDIAN
Definition: BlockType.h:59
@ E_BLOCK_SOULSAND
Definition: BlockType.h:103
@ E_BLOCK_ACTIVE_COMPARATOR
Definition: BlockType.h:166
@ E_BLOCK_MYCELIUM
Definition: BlockType.h:125
@ E_BLOCK_RED_SANDSTONE_STAIRS
Definition: BlockType.h:199
@ E_BLOCK_YELLOW_FLOWER
Definition: BlockType.h:283
@ E_BLOCK_SNOW_BLOCK
Definition: BlockType.h:94
@ E_BLOCK_SNOW
Definition: BlockType.h:92
@ E_BLOCK_BROWN_MUSHROOM
Definition: BlockType.h:49
@ E_BLOCK_BOOKCASE
Definition: BlockType.h:57
@ E_BLOCK_PISTON_MOVED_BLOCK
Definition: BlockType.h:46
@ E_BLOCK_RED_SANDSTONE
Definition: BlockType.h:198
@ E_BLOCK_IRON_ORE
Definition: BlockType.h:25
@ E_BLOCK_STRUCTURE_BLOCK
Definition: BlockType.h:273
@ E_BLOCK_TRAPPED_CHEST
Definition: BlockType.h:161
@ E_BLOCK_OAK_DOOR
Definition: BlockType.h:77
@ E_BLOCK_PLANKS
Definition: BlockType.h:15
@ E_BLOCK_SPRUCE_FENCE_GATE
Definition: BlockType.h:202
@ E_BLOCK_GRAY_SHULKER_BOX
Definition: BlockType.h:245
@ E_BLOCK_DETECTOR_RAIL
Definition: BlockType.h:38
@ E_BLOCK_GRAVEL
Definition: BlockType.h:23
@ E_BLOCK_REDSTONE_WIRE
Definition: BlockType.h:65
@ E_BLOCK_IRON_BARS
Definition: BlockType.h:116
@ E_BLOCK_HAY_BALE
Definition: BlockType.h:189
@ E_BLOCK_LIGHT_BLUE_GLAZED_TERRACOTTA
Definition: BlockType.h:257
@ E_BLOCK_SPRUCE_WOOD_STAIRS
Definition: BlockType.h:149
@ E_BLOCK_YELLOW_SHULKER_BOX
Definition: BlockType.h:242
@ E_BLOCK_DARK_OAK_FENCE_GATE
Definition: BlockType.h:205
@ E_BLOCK_CONCRETE_POWDER
Definition: BlockType.h:271
@ E_BLOCK_JUNGLE_FENCE_GATE
Definition: BlockType.h:204
@ E_BLOCK_PURPLE_GLAZED_TERRACOTTA
Definition: BlockType.h:264
@ E_BLOCK_PUMPKIN
Definition: BlockType.h:101
@ E_BLOCK_BIG_FLOWER
Definition: BlockType.h:194
@ E_BLOCK_STAINED_CLAY
Definition: BlockType.h:177
@ E_BLOCK_ANVIL
Definition: BlockType.h:160
@ E_BLOCK_HARDENED_CLAY
Definition: BlockType.h:191
@ E_BLOCK_HUGE_BROWN_MUSHROOM
Definition: BlockType.h:114
@ E_BLOCK_COMMAND_BLOCK
Definition: BlockType.h:152
@ E_BLOCK_SUGARCANE
Definition: BlockType.h:97
@ E_BLOCK_WOODEN_PRESSURE_PLATE
Definition: BlockType.h:86
@ E_BLOCK_SANDSTONE
Definition: BlockType.h:34
@ E_BLOCK_RED_ROSE
Definition: BlockType.h:284
@ E_BLOCK_HUGE_RED_MUSHROOM
Definition: BlockType.h:115
@ E_BLOCK_VINES
Definition: BlockType.h:121
@ E_BLOCK_EMERALD_BLOCK
Definition: BlockType.h:148
@ E_BLOCK_TORCH
Definition: BlockType.h:60
@ E_BLOCK_GREEN_SHULKER_BOX
Definition: BlockType.h:251
@ E_BLOCK_BLACK_SHULKER_BOX
Definition: BlockType.h:253
@ E_BLOCK_SPRUCE_FENCE
Definition: BlockType.h:207
@ E_BLOCK_REDSTONE_TORCH_OFF
Definition: BlockType.h:89
@ E_BLOCK_GOLD_ORE
Definition: BlockType.h:24
@ E_BLOCK_STONE
Definition: BlockType.h:11
@ E_BLOCK_END_GATEWAY
Definition: BlockType.h:228
@ E_BLOCK_LIGHT_GRAY_GLAZED_TERRACOTTA
Definition: BlockType.h:262
@ E_BLOCK_NETHER_QUARTZ_ORE
Definition: BlockType.h:170
@ E_BLOCK_LIGHT_GRAY_SHULKER_BOX
Definition: BlockType.h:246
@ E_BLOCK_GREEN_GLAZED_TERRACOTTA
Definition: BlockType.h:267
@ E_BLOCK_WOODEN_SLAB
Definition: BlockType.h:141
@ E_BLOCK_SEA_LANTERN
Definition: BlockType.h:188
@ E_BLOCK_NOTE_BLOCK
Definition: BlockType.h:35
@ E_BLOCK_LADDER
Definition: BlockType.h:78
@ E_BLOCK_DARK_OAK_DOOR
Definition: BlockType.h:216
@ E_BLOCK_BED
Definition: BlockType.h:36
@ E_BLOCK_RED_MUSHROOM
Definition: BlockType.h:50
@ E_BLOCK_ACACIA_DOOR
Definition: BlockType.h:215
@ E_BLOCK_DIRT
Definition: BlockType.h:13
@ E_BLOCK_SANDSTONE_STAIRS
Definition: BlockType.h:143
@ E_BLOCK_QUARTZ_BLOCK
Definition: BlockType.h:172
@ E_BLOCK_NETHERRACK
Definition: BlockType.h:102
@ E_BLOCK_LOG
Definition: BlockType.h:27
@ E_BLOCK_SAPLING
Definition: BlockType.h:16
@ E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE
Definition: BlockType.h:162
@ E_BLOCK_HOPPER
Definition: BlockType.h:171
@ E_BLOCK_ACACIA_FENCE
Definition: BlockType.h:211
@ E_BLOCK_DROPPER
Definition: BlockType.h:176
@ E_BLOCK_REDSTONE_REPEATER_OFF
Definition: BlockType.h:108
@ E_BLOCK_ENDER_CHEST
Definition: BlockType.h:145
@ E_BLOCK_END_PORTAL
Definition: BlockType.h:134
@ E_BLOCK_GLOWSTONE
Definition: BlockType.h:104
@ E_BLOCK_RAIL
Definition: BlockType.h:79
@ E_BLOCK_SAND
Definition: BlockType.h:22
@ E_BLOCK_DISPENSER
Definition: BlockType.h:33
@ E_BLOCK_IRON_TRAPDOOR
Definition: BlockType.h:186
@ E_BLOCK_MAGMA
Definition: BlockType.h:232
@ E_BLOCK_PURPUR_DOUBLE_SLAB
Definition: BlockType.h:223
@ E_BLOCK_LIME_GLAZED_TERRACOTTA
Definition: BlockType.h:259
@ E_BLOCK_STONE_BUTTON
Definition: BlockType.h:91
@ E_BLOCK_GLASS
Definition: BlockType.h:30
@ E_BLOCK_REDSTONE_LAMP_ON
Definition: BlockType.h:139
@ E_BLOCK_PUMPKIN_STEM
Definition: BlockType.h:119
@ E_BLOCK_INVERTED_DAYLIGHT_SENSOR
Definition: BlockType.h:197
@ E_BLOCK_FLOWER_POT
Definition: BlockType.h:155
@ E_BLOCK_TRIPWIRE_HOOK
Definition: BlockType.h:146
@ E_BLOCK_WHITE_GLAZED_TERRACOTTA
Definition: BlockType.h:254
@ E_BLOCK_END_STONE
Definition: BlockType.h:136
@ E_BLOCK_STATIONARY_WATER
Definition: BlockType.h:19
@ E_BLOCK_COBBLESTONE_WALL
Definition: BlockType.h:154
@ E_BLOCK_PURPUR_SLAB
Definition: BlockType.h:224
@ E_BLOCK_BROWN_GLAZED_TERRACOTTA
Definition: BlockType.h:266
@ E_BLOCK_MOB_SPAWNER
Definition: BlockType.h:62
@ E_BLOCK_NETHER_BRICK_FENCE
Definition: BlockType.h:128
@ E_BLOCK_RED_SANDSTONE_SLAB
Definition: BlockType.h:201
@ E_BLOCK_QUARTZ_STAIRS
Definition: BlockType.h:173
@ E_BLOCK_RED_SHULKER_BOX
Definition: BlockType.h:252
@ E_BLOCK_WALLSIGN
Definition: BlockType.h:82
@ E_BLOCK_BIRCH_FENCE
Definition: BlockType.h:208
@ E_BLOCK_BARRIER
Definition: BlockType.h:185
@ E_BLOCK_LAVA
Definition: BlockType.h:20
@ E_BLOCK_NETHER_BRICK
Definition: BlockType.h:127
@ E_BLOCK_FROSTED_ICE
Definition: BlockType.h:231
@ E_BLOCK_PISTON
Definition: BlockType.h:43
@ E_BLOCK_WALL_BANNER
Definition: BlockType.h:196
@ E_BLOCK_RED_GLAZED_TERRACOTTA
Definition: BlockType.h:268
@ E_BLOCK_TALL_GRASS
Definition: BlockType.h:41
@ E_BLOCK_JUNGLE_FENCE
Definition: BlockType.h:209
@ E_BLOCK_COBBLESTONE
Definition: BlockType.h:14
unsigned char NIBBLETYPE
The datatype used by nibbledata (meta, light, skylight)
Definition: ChunkDef.h:44
unsigned char BLOCKTYPE
The datatype used by blockdata.
Definition: ChunkDef.h:41
eBlockFace
Block face constants, used in PlayerDigging and PlayerBlockPlacement packets and bbox collision calc.
Definition: Defines.h:38
@ BLOCK_FACE_XP
Definition: Defines.h:41
@ BLOCK_FACE_YP
Definition: Defines.h:43
@ BLOCK_FACE_YM
Definition: Defines.h:42
@ BLOCK_FACE_ZM
Definition: Defines.h:44
@ BLOCK_FACE_ZP
Definition: Defines.h:45
@ BLOCK_FACE_XM
Definition: Defines.h:40
MTRand & GetRandomProvider()
Returns the current thread's random number source.
Definition: FastRandom.cpp:12
#define UNREACHABLE(x)
Definition: Globals.h:288
Byte ColourID
Definition: Globals.h:162
#define UNUSED
Definition: Globals.h:72
bool IsTool(short a_ItemType)
Definition: Defines.cpp:499
static float GetBlockHeight(BLOCKTYPE Block)
Block's height.
Definition: BlockInfo.cpp:1153
static bool IsSolid(BLOCKTYPE Block)
Is this block solid (player cannot walk through)?
Definition: BlockInfo.cpp:892
Common class that takes care of beetroots, carrots, potatoes and wheat.
Definition: BlockCrops.h:15
virtual cItems ConvertToPickups(NIBBLETYPE a_BlockMeta, const cItem *a_Tool=nullptr) const
Returns the pickups that would result if the block was mined by a_Digger using a_Tool.
virtual cBoundingBox GetPlacementCollisionBox(BLOCKTYPE a_XM, BLOCKTYPE a_XP, BLOCKTYPE a_YM, BLOCKTYPE a_YP, BLOCKTYPE a_ZM, BLOCKTYPE a_ZP) const
Returns the relative bounding box that must be entity-free in order for the block to be placed.
static void NeighborChanged(cChunkInterface &a_ChunkInterface, Vector3i a_NeighborPos, eBlockFace a_WhichNeighbor)
Notifies the specified neighbor that the current block has changed.
virtual bool IsUseable(void) const
Called to check whether this block supports a rclk action.
void Check(cChunkInterface &ChunkInterface, cBlockPluginInterface &a_PluginInterface, Vector3i a_RelPos, cChunk &a_Chunk) const
Called when one of the neighbors gets set; equivalent to MC block update.
virtual bool IsInsideBlock(const Vector3d a_RelPosition, const NIBBLETYPE a_BlockMeta) const
Tests if a_RelPosition is inside the block, where a_RelPosition is relative to the origin of the bloc...
virtual void OnNeighborChanged(cChunkInterface &a_ChunkInterface, Vector3i a_BlockPos, eBlockFace a_WhichNeighbor) const
Called when a direct neighbor of this block has been changed.
static unsigned char ToolFortuneLevel(const cItem *a_Tool)
Returns the fortune level of a tool, if it is a valid tool.
static char FortuneDiscreteRandom(char a_MinDrop, char a_DefaultMax, unsigned char a_BonusMax, char a_DropCap=25)
Returns a random number of drops taking into account fortune.
static bool ToolHasSilkTouch(const cItem *a_Tool)
Returns true if the specified tool is valid and has a non-zero silk-touch enchantment.
virtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const
Returns the base colour ID of the block, as will be represented on a map, as per documentation: https...
static const cBlockHandler & For(BLOCKTYPE a_BlockType)
virtual void OnUpdate(cChunkInterface &a_ChunkInterface, cWorldInterface &a_WorldInterface, cBlockPluginInterface &a_BlockPluginInterface, cChunk &a_Chunk, const Vector3i a_RelPos) const
Called when the block gets ticked either by a random tick or by a queued tick.
virtual bool DoesIgnoreBuildCollision(const cWorld &a_World, const cItem &a_HeldItem, Vector3i a_Position, NIBBLETYPE a_Meta, eBlockFace a_ClickedBlockFace, bool a_ClickedDirectly) const
Checks if the player can build "inside" this block.
virtual bool CanBeAt(const cChunk &a_Chunk, Vector3i a_Position, NIBBLETYPE a_Meta) const
Checks if the block can stay at the specified relative coords in the chunk.
const BLOCKTYPE m_BlockType
Definition: BlockHandler.h:205
Handler for huge mushroom blocks.
Handler for the small (singleblock) mushrooms.
Definition: BlockMushroom.h:13
This interface is used to decouple block handlers from the cPluginManager dependency through cWorld.
Handler for blocks that have 3 orientations (hay bale, log), specified by the upper 2 bits in meta.
Definition: BlockSideways.h:14
Handler for stems from which produce grows in an adjacent block (melon, pumpkin) after it becomes rip...
Definition: BlockStems.h:16
Handles the grass that is 1 block tall.
bool DoWithChunkAt(Vector3i a_BlockPos, cFunctionRef< bool(cChunk &)> a_Callback)
BLOCKTYPE GetBlock(Vector3i a_Pos)
void DropBlockAsPickups(Vector3i a_BlockPos, const cEntity *a_Digger=nullptr, const cItem *a_Tool=nullptr)
Digs the block and spawns the relevant pickups, as if a_Digger used a_Tool to dig the block.
Represents two sets of coords, minimum and maximum for each direction.
Definition: BoundingBox.h:24
Definition: Chunk.h:36
cChunkCoords GetPos() const
Definition: Chunk.h:133
static bool IsValidHeight(Vector3i a_BlockPosition)
Validates a height-coordinate.
Definition: ChunkDef.h:185
static Vector3i RelativeToAbsolute(Vector3i a_RelBlockPosition, cChunkCoords a_ChunkCoords)
Converts relative block coordinates into absolute coordinates with a known chunk location.
Definition: ChunkDef.h:174
unsigned int GetLevel(int a_EnchantmentID) const
Returns the level for the specified enchantment; 0 if not stored.
IntType RandInt(IntType a_Min, IntType a_Max)
Return a random IntType in the range [a_Min, a_Max].
Definition: FastRandom.h:78
Definition: Item.h:37
cEnchantments m_Enchantments
Definition: Item.h:166
short m_ItemType
Definition: Item.h:163
This class bridges a vector of cItem for safe access via Lua.
Definition: Item.h:215
T y
Definition: Vector3.h:17
Definition: World.h:53