mojira.dev
MCPE-234801

Custom stairs may not connect to themselves

Custom blocks can be made to act like Vanilla stairs by using the minecraft:corner_and_cardinal_direction state in the minecraft:placement_direction trait. Unfortunately, this trait can fail to apply corner states correctly. This has been observed with inner self-connections but may exist in more circumstances.

Workaround available

The minecraft:connection trait can be enabled to make corner connections work as expected. However, this is unreasonable, as it multiplies the number of permutations by 16.

Demonstration

This bug can be seen in the following screenshot:

Without Connection — Self Connections Demo.png

The corner states are being set to "none”. Other situations, including cornering with Vanilla stairs, work correctly:

Without Connection — Vanilla Connections Demo.png

Reproduction

The code below was used for the custom calcite stairs shown above:

{
	"format_version": "1.26",
	"minecraft:block": {
		"description": {
			"identifier": "bug_stairs:custom_stairs_without_connection",
			
			"traits": {
				"minecraft:placement_position": {
					"enabled_states": ["minecraft:vertical_half"]
				},
				"minecraft:placement_direction": {
					"enabled_states": ["minecraft:corner_and_cardinal_direction"],
					"blocks_to_corner_with": [{"tags": "q.all_tags('minecraft:cornerable_stairs')"}]
				}
			}
		},
		
		"components": {
			"tag:minecraft:cornerable_stairs": {},
			
			"minecraft:geometry": {
				"identifier": "geometry.bug_stairs.stairs.right_side_up",
				"bone_visibility": {
					"east": "q.block_state('minecraft:cardinal_direction') == 'east' && q.block_state('minecraft:corner') != 'outer_left' && q.block_state('minecraft:corner') != 'outer_right'",
					"east.southwest": "q.block_state('minecraft:cardinal_direction') == 'east' && q.block_state('minecraft:corner') == 'inner_right'",
					"east.northwest": "q.block_state('minecraft:cardinal_direction') == 'east' && q.block_state('minecraft:corner') == 'inner_left'",
					"west": "q.block_state('minecraft:cardinal_direction') == 'west' && q.block_state('minecraft:corner') != 'outer_left' && q.block_state('minecraft:corner') != 'outer_right'",
					"west.southeast": "q.block_state('minecraft:cardinal_direction') == 'west' && q.block_state('minecraft:corner') == 'inner_left'",
					"west.northeast": "q.block_state('minecraft:cardinal_direction') == 'west' && q.block_state('minecraft:corner') == 'inner_right'",
					"south": "q.block_state('minecraft:cardinal_direction') == 'south' && q.block_state('minecraft:corner') != 'outer_left' && q.block_state('minecraft:corner') != 'outer_right'",
					"south.northeast": "q.block_state('minecraft:cardinal_direction') == 'south' && q.block_state('minecraft:corner') == 'inner_left'",
					"south.northwest": "q.block_state('minecraft:cardinal_direction') == 'south' && q.block_state('minecraft:corner') == 'inner_right'",
					"north": "q.block_state('minecraft:cardinal_direction') == 'north' && q.block_state('minecraft:corner') != 'outer_left' && q.block_state('minecraft:corner') != 'outer_right'",
					"north.southeast": "q.block_state('minecraft:cardinal_direction') == 'north' && q.block_state('minecraft:corner') == 'inner_right'",
					"north.southwest": "q.block_state('minecraft:cardinal_direction') == 'north' && q.block_state('minecraft:corner') == 'inner_left'",
					"northwest": "(q.block_state('minecraft:cardinal_direction') == 'west' && q.block_state('minecraft:corner') == 'outer_right') || (q.block_state('minecraft:cardinal_direction') == 'north' && q.block_state('minecraft:corner') == 'outer_left')",
					"southwest": "(q.block_state('minecraft:cardinal_direction') == 'west' && q.block_state('minecraft:corner') == 'outer_left') || (q.block_state('minecraft:cardinal_direction') == 'south' && q.block_state('minecraft:corner') == 'outer_right')",
					"northeast": "(q.block_state('minecraft:cardinal_direction') == 'east' && q.block_state('minecraft:corner') == 'outer_left') || (q.block_state('minecraft:cardinal_direction') == 'north' && q.block_state('minecraft:corner') == 'outer_right')",
					"southeast": "(q.block_state('minecraft:cardinal_direction') == 'east' && q.block_state('minecraft:corner') == 'outer_right') || (q.block_state('minecraft:cardinal_direction') == 'south' && q.block_state('minecraft:corner') == 'outer_left')"
				}
			},
			"minecraft:material_instances": {
				"*": {"texture": "calcite"}
			}
		},
		"permutations": [
			{
				"condition": "q.block_state('minecraft:vertical_half') == 'top'",
				"components": {
					"minecraft:geometry": {
						"identifier": "geometry.bug_stairs.stairs.upside_down",
						"bone_visibility": {
							"east": "q.block_state('minecraft:cardinal_direction') == 'east' && q.block_state('minecraft:corner') != 'outer_left' && q.block_state('minecraft:corner') != 'outer_right'",
							"east.southwest": "q.block_state('minecraft:cardinal_direction') == 'east' && q.block_state('minecraft:corner') == 'inner_right'",
							"east.northwest": "q.block_state('minecraft:cardinal_direction') == 'east' && q.block_state('minecraft:corner') == 'inner_left'",
							"west": "q.block_state('minecraft:cardinal_direction') == 'west' && q.block_state('minecraft:corner') != 'outer_left' && q.block_state('minecraft:corner') != 'outer_right'",
							"west.southeast": "q.block_state('minecraft:cardinal_direction') == 'west' && q.block_state('minecraft:corner') == 'inner_left'",
							"west.northeast": "q.block_state('minecraft:cardinal_direction') == 'west' && q.block_state('minecraft:corner') == 'inner_right'",
							"south": "q.block_state('minecraft:cardinal_direction') == 'south' && q.block_state('minecraft:corner') != 'outer_left' && q.block_state('minecraft:corner') != 'outer_right'",
							"south.northeast": "q.block_state('minecraft:cardinal_direction') == 'south' && q.block_state('minecraft:corner') == 'inner_left'",
							"south.northwest": "q.block_state('minecraft:cardinal_direction') == 'south' && q.block_state('minecraft:corner') == 'inner_right'",
							"north": "q.block_state('minecraft:cardinal_direction') == 'north' && q.block_state('minecraft:corner') != 'outer_left' && q.block_state('minecraft:corner') != 'outer_right'",
							"north.southeast": "q.block_state('minecraft:cardinal_direction') == 'north' && q.block_state('minecraft:corner') == 'inner_right'",
							"north.southwest": "q.block_state('minecraft:cardinal_direction') == 'north' && q.block_state('minecraft:corner') == 'inner_left'",
							"northwest": "(q.block_state('minecraft:cardinal_direction') == 'west' && q.block_state('minecraft:corner') == 'outer_right') || (q.block_state('minecraft:cardinal_direction') == 'north' && q.block_state('minecraft:corner') == 'outer_left')",
							"southwest": "(q.block_state('minecraft:cardinal_direction') == 'west' && q.block_state('minecraft:corner') == 'outer_left') || (q.block_state('minecraft:cardinal_direction') == 'south' && q.block_state('minecraft:corner') == 'outer_right')",
							"northeast": "(q.block_state('minecraft:cardinal_direction') == 'east' && q.block_state('minecraft:corner') == 'outer_left') || (q.block_state('minecraft:cardinal_direction') == 'north' && q.block_state('minecraft:corner') == 'outer_right')",
							"southeast": "(q.block_state('minecraft:cardinal_direction') == 'east' && q.block_state('minecraft:corner') == 'outer_right') || (q.block_state('minecraft:cardinal_direction') == 'south' && q.block_state('minecraft:corner') == 'outer_left')"
						}
					},
					"minecraft:material_instances": {
						"*": {"texture": "calcite"}
					}
				}
			}
		]
	}
}
{
	"format_version": "1.26",
	"minecraft:block": {
		"description": {
			"identifier": "bug_stairs:custom_stairs_without_connection",
			
			"traits": {
				"minecraft:placement_position": {
					"enabled_states": ["minecraft:vertical_half"]
				},
				"minecraft:placement_direction": {
					"enabled_states": ["minecraft:corner_and_cardinal_direction"],
					"blocks_to_corner_with": [{"tags": "q.all_tags('minecraft:cornerable_stairs')"}]
				}
			}
		},
		
		"components": {
			"tag:minecraft:cornerable_stairs": {},
			
			"minecraft:geometry": {
				"identifier": "geometry.bug_stairs.stairs.right_side_up",
				"bone_visibility": {
					"east": "q.block_state('minecraft:cardinal_direction') == 'east' && q.block_state('minecraft:corner') != 'outer_left' && q.block_state('minecraft:corner') != 'outer_right'",
					"east.southwest": "q.block_state('minecraft:cardinal_direction') == 'east' && q.block_state('minecraft:corner') == 'inner_right'",
					"east.northwest": "q.block_state('minecraft:cardinal_direction') == 'east' && q.block_state('minecraft:corner') == 'inner_left'",
					"west": "q.block_state('minecraft:cardinal_direction') == 'west' && q.block_state('minecraft:corner') != 'outer_left' && q.block_state('minecraft:corner') != 'outer_right'",
					"west.southeast": "q.block_state('minecraft:cardinal_direction') == 'west' && q.block_state('minecraft:corner') == 'inner_left'",
					"west.northeast": "q.block_state('minecraft:cardinal_direction') == 'west' && q.block_state('minecraft:corner') == 'inner_right'",
					"south": "q.block_state('minecraft:cardinal_direction') == 'south' && q.block_state('minecraft:corner') != 'outer_left' && q.block_state('minecraft:corner') != 'outer_right'",
					"south.northeast": "q.block_state('minecraft:cardinal_direction') == 'south' && q.block_state('minecraft:corner') == 'inner_left'",
					"south.northwest": "q.block_state('minecraft:cardinal_direction') == 'south' && q.block_state('minecraft:corner') == 'inner_right'",
					"north": "q.block_state('minecraft:cardinal_direction') == 'north' && q.block_state('minecraft:corner') != 'outer_left' && q.block_state('minecraft:corner') != 'outer_right'",
					"north.southeast": "q.block_state('minecraft:cardinal_direction') == 'north' && q.block_state('minecraft:corner') == 'inner_right'",
					"north.southwest": "q.block_state('minecraft:cardinal_direction') == 'north' && q.block_state('minecraft:corner') == 'inner_left'",
					"northwest": "(q.block_state('minecraft:cardinal_direction') == 'west' && q.block_state('minecraft:corner') == 'outer_right') || (q.block_state('minecraft:cardinal_direction') == 'north' && q.block_state('minecraft:corner') == 'outer_left')",
					"southwest": "(q.block_state('minecraft:cardinal_direction') == 'west' && q.block_state('minecraft:corner') == 'outer_left') || (q.block_state('minecraft:cardinal_direction') == 'south' && q.block_state('minecraft:corner') == 'outer_right')",
					"northeast": "(q.block_state('minecraft:cardinal_direction') == 'east' && q.block_state('minecraft:corner') == 'outer_left') || (q.block_state('minecraft:cardinal_direction') == 'north' && q.block_state('minecraft:corner') == 'outer_right')",
					"southeast": "(q.block_state('minecraft:cardinal_direction') == 'east' && q.block_state('minecraft:corner') == 'outer_right') || (q.block_state('minecraft:cardinal_direction') == 'south' && q.block_state('minecraft:corner') == 'outer_left')"
				}
			},
			"minecraft:material_instances": {
				"*": {"texture": "calcite"}
			}
		},
		"permutations": [
			{
				"condition": "q.block_state('minecraft:vertical_half') == 'top'",
				"components": {
					"minecraft:geometry": {
						"identifier": "geometry.bug_stairs.stairs.upside_down",
						"bone_visibility": {
							"east": "q.block_state('minecraft:cardinal_direction') == 'east' && q.block_state('minecraft:corner') != 'outer_left' && q.block_state('minecraft:corner') != 'outer_right'",
							"east.southwest": "q.block_state('minecraft:cardinal_direction') == 'east' && q.block_state('minecraft:corner') == 'inner_right'",
							"east.northwest": "q.block_state('minecraft:cardinal_direction') == 'east' && q.block_state('minecraft:corner') == 'inner_left'",
							"west": "q.block_state('minecraft:cardinal_direction') == 'west' && q.block_state('minecraft:corner') != 'outer_left' && q.block_state('minecraft:corner') != 'outer_right'",
							"west.southeast": "q.block_state('minecraft:cardinal_direction') == 'west' && q.block_state('minecraft:corner') == 'inner_left'",
							"west.northeast": "q.block_state('minecraft:cardinal_direction') == 'west' && q.block_state('minecraft:corner') == 'inner_right'",
							"south": "q.block_state('minecraft:cardinal_direction') == 'south' && q.block_state('minecraft:corner') != 'outer_left' && q.block_state('minecraft:corner') != 'outer_right'",
							"south.northeast": "q.block_state('minecraft:cardinal_direction') == 'south' && q.block_state('minecraft:corner') == 'inner_left'",
							"south.northwest": "q.block_state('minecraft:cardinal_direction') == 'south' && q.block_state('minecraft:corner') == 'inner_right'",
							"north": "q.block_state('minecraft:cardinal_direction') == 'north' && q.block_state('minecraft:corner') != 'outer_left' && q.block_state('minecraft:corner') != 'outer_right'",
							"north.southeast": "q.block_state('minecraft:cardinal_direction') == 'north' && q.block_state('minecraft:corner') == 'inner_right'",
							"north.southwest": "q.block_state('minecraft:cardinal_direction') == 'north' && q.block_state('minecraft:corner') == 'inner_left'",
							"northwest": "(q.block_state('minecraft:cardinal_direction') == 'west' && q.block_state('minecraft:corner') == 'outer_right') || (q.block_state('minecraft:cardinal_direction') == 'north' && q.block_state('minecraft:corner') == 'outer_left')",
							"southwest": "(q.block_state('minecraft:cardinal_direction') == 'west' && q.block_state('minecraft:corner') == 'outer_left') || (q.block_state('minecraft:cardinal_direction') == 'south' && q.block_state('minecraft:corner') == 'outer_right')",
							"northeast": "(q.block_state('minecraft:cardinal_direction') == 'east' && q.block_state('minecraft:corner') == 'outer_left') || (q.block_state('minecraft:cardinal_direction') == 'north' && q.block_state('minecraft:corner') == 'outer_right')",
							"southeast": "(q.block_state('minecraft:cardinal_direction') == 'east' && q.block_state('minecraft:corner') == 'outer_right') || (q.block_state('minecraft:cardinal_direction') == 'south' && q.block_state('minecraft:corner') == 'outer_left')"
						}
					},
					"minecraft:material_instances": {
						"*": {"texture": "calcite"}
					}
				}
			}
		]
	}
}

The bone visibility can be safely ignored; it is the states themselves that are not being applied properly.

The code was taken from the behavior pack inside the following world:

[media]

This world can be opened (in Minecraft Preview) for inspection or unzipped to access the code associated with such. Also included are demos involving custom stairs that include the minecraft:connection block trait.

Linked issues

Attachments

Comments 2

This appears to duplicate MCPE-232019.

Didn’t catch that one when reporting. Thank you, @phizlip.

Ciosciaa

(Unassigned)

Unconfirmed

Multiple

26.0.27 Preview

Retrieved