This tutorial introduces the core concepts of the Allay Blocks API and shows practical ways to find block types, work
with block states and properties, and read/write blocks in the dimension.
An immutable data object that represents a block at a specific position (and layer) in a dimension.
It wraps a BlockState and adds dimension position/layer utilities.
// "At this location, what is the block and what can I do with it?"Blockblock=newBlock(dimension,x,y,z);BlockStatestate=block.getBlockState();booleanisOpen=block.getPropertyValue(BlockPropertyTypes.OPEN_BIT);
BlockPropertyType describes a configurable property for a BlockType (e.g., "open", "facing", "age").
BlockPropertyTypes is a central collection of known property definitions.
// Check if a block type has a propertybooleanhasFacing=BlockTypes.OAK_DOOR.hasProperty(BlockPropertyTypes.MINECRAFT_CARDINAL_DIRECTION);// Get property value from a stateMinecraftCardinalDirectionfacing=doorState.getPropertyValue(BlockPropertyTypes.MINECRAFT_CARDINAL_DIRECTION);
importorg.allaymc.api.block.type.BlockType;importorg.allaymc.api.registry.Registries;importorg.allaymc.api.utils.identifier.Identifier;// Look up by identifierIdentifierid=newIdentifier("minecraft:stone");BlockType<?>stone=Registries.BLOCK_TYPE.get(id);// may be null if not found// Or use string directlyBlockType<?>dirt=Registries.BLOCK_TYPE.get(newIdentifier("minecraft:dirt"));
importorg.allaymc.api.block.type.BlockTypes;importorg.allaymc.api.block.state.BlockState;importorg.allaymc.api.block.property.BlockPropertyTypes;importorg.allaymc.api.block.property.enums.MinecraftCardinalDirection;// Method 1: Create from property values directlyBlockStatedoor=BlockTypes.OAK_DOOR.ofState(BlockPropertyTypes.DOOR_HINGE_BIT.createValue(false),BlockPropertyTypes.MINECRAFT_CARDINAL_DIRECTION.createValue(MinecraftCardinalDirection.NORTH),BlockPropertyTypes.OPEN_BIT.createValue(false),BlockPropertyTypes.UPPER_BLOCK_BIT.createValue(false));// Method 2: Start from default and set properties (immutably)BlockStateclosedNorthDoor=BlockTypes.OAK_DOOR.getDefaultState().setPropertyValue(BlockPropertyTypes.OPEN_BIT,false).setPropertyValue(BlockPropertyTypes.MINECRAFT_CARDINAL_DIRECTION,MinecraftCardinalDirection.NORTH);
importorg.allaymc.api.block.type.BlockTypes;importorg.allaymc.api.block.state.BlockState;BlockStateoakDoor=BlockTypes.OAK_DOOR.getDefaultState().setPropertyValue(BlockPropertyTypes.OPEN_BIT,true);// Copy property values to another door type (same properties)BlockStatedarkOakDoor=BlockTypes.DARK_OAK_DOOR.copyPropertyValuesFrom(oakDoor);// darkOakDoor now has open_bit=true
importorg.allaymc.api.block.state.BlockState;importorg.allaymc.api.block.type.BlockStateGetter;// Legacy id + data value format (automatically updated to latest state)BlockStatestone=BlockStateGetter.name("minecraft:stone").val(1).blockState();// Old property formatBlockStateanvil=BlockStateGetter.name("minecraft:anvil").property("damage","very_damaged").blockState();// Just get default state by nameBlockStatepinkPetals=BlockStateGetter.name("minecraft:pink_petals").blockState();
// Get block at layer 0 (default)BlockStatemainBlock=dimension.getBlockState(x,y,z);// Get block at layer 1 (e.g., water inside a waterlogged block)BlockStateliquidBlock=dimension.getBlockState(x,y,z,1);
importorg.allaymc.api.block.type.BlockTypes;importorg.allaymc.api.block.state.BlockState;importorg.allaymc.api.world.Dimension;publicvoidplaceStone(Dimensiondimension,intx,inty,intz){BlockStatestone=BlockTypes.STONE.getDefaultState();dimension.setBlockState(x,y,z,stone);}publicvoidplaceWaterInBlock(Dimensiondimension,intx,inty,intz){// Set water at layer 1 (waterlogged)BlockStatewater=BlockTypes.WATER.getDefaultState();dimension.setBlockState(x,y,z,water,1);}
importorg.allaymc.api.block.Block;importorg.allaymc.api.block.property.BlockPropertyTypes;importorg.allaymc.api.world.Dimension;publicvoidtoggleDoor(Dimensiondimension,intx,inty,intz){Blockdoor=newBlock(dimension,x,y,z);// Read current valuebooleanisOpen=door.getPropertyValue(BlockPropertyTypes.OPEN_BIT);// Update the property (modifies the block in the dimension)door.updateBlockProperty(BlockPropertyTypes.OPEN_BIT,!isOpen);}
importorg.allaymc.api.block.type.BlockTypes;importorg.allaymc.api.block.state.BlockState;importorg.allaymc.api.block.property.BlockPropertyTypes;importorg.allaymc.api.block.property.enums.MinecraftCardinalDirection;importorg.allaymc.api.world.Dimension;publicvoidrotateDoorToNorth(Dimensiondimension,intx,inty,intz){BlockStatecurrent=dimension.getBlockState(x,y,z);// Check if it's a doorif(current.getBlockType()==BlockTypes.OAK_DOOR){// Create new state with updated propertyBlockStaterotated=current.setPropertyValue(BlockPropertyTypes.MINECRAFT_CARDINAL_DIRECTION,MinecraftCardinalDirection.NORTH);// Write back to dimensiondimension.setBlockState(x,y,z,rotated);}}
importorg.allaymc.api.block.type.BlockTypes;importorg.allaymc.api.block.property.BlockPropertyTypes;// Check on BlockTypebooleancanOpen=BlockTypes.OAK_DOOR.hasProperty(BlockPropertyTypes.OPEN_BIT);booleanhasAge=BlockTypes.WHEAT.hasProperty(BlockPropertyTypes.AGE);// Check on BlockStateBlockStatestate=BlockTypes.OAK_DOOR.getDefaultState();booleanhasOpenBit=state.hasProperty(BlockPropertyTypes.OPEN_BIT);
importorg.allaymc.api.block.type.BlockTypes;importorg.allaymc.api.block.property.type.BlockPropertyType;// Get all property types for a blockvarproperties=BlockTypes.OAK_DOOR.getProperties();for(BlockPropertyType<?>prop:properties.values()){System.out.println("Property: "+prop.getName());}
importorg.allaymc.api.block.type.BlockTypes;importorg.allaymc.api.entity.interfaces.EntityPlayer;publicbooleanisStandingOnGold(EntityPlayerplayer){varpos=player.getLocation();vardimension=player.getDimension();// Get block below playerBlockStatebelow=dimension.getBlockState((int)pos.x(),(int)pos.y()-1,(int)pos.z());returnbelow.getBlockType()==BlockTypes.GOLD_BLOCK;}
importorg.allaymc.api.block.type.BlockTypes;importorg.allaymc.api.block.state.BlockState;importorg.allaymc.api.world.Dimension;publicvoidbuildPillar(Dimensiondimension,intx,inty,intz,intheight){BlockStatestone=BlockTypes.STONE.getDefaultState();BlockStatestoneBrick=BlockTypes.STONEBRICK.getDefaultState();for(inti=0;i<height;i++){// Alternate between stone and stone brickBlockStateblock=(i%2==0)?stone:stoneBrick;dimension.setBlockState(x,y+i,z,block);}}
BlockStateoriginal=BlockTypes.OAK_DOOR.getDefaultState();BlockStatemodified=original.setPropertyValue(BlockPropertyTypes.OPEN_BIT,true);// original still has open_bit=false
Don't Forget Block Layers
When working with waterlogged blocks, remember to check layer 1 for water: