Pistons and sticky pistons share the same push mechanics but differ in their retraction behavior. Understanding the underlying block-event model is a prerequisite for reliable machine design.
A normal piston extends to push up to 12 blocks in a line. It cannot retract any block. A sticky piston retracts one block — the block immediately adjacent to its face on the tick the piston retracts. If a second sticky piston pulls that same block simultaneously, the result is version-dependent.
A piston can push a chain of at most 12 movable blocks. The moment a 13th movable block is in the line — or any immovable block is encountered — the piston fails silently and does not extend at all. This constraint governs flying machine payload capacity.
| Block Category | Push Behavior | Sticky Behavior |
|---|---|---|
| Air | N/A | N/A |
| Normal blocks (stone, logs…) | Pushed | Pulled |
| Obsidian, bedrock, furnace-lit… | Immovable — stops push | Immovable |
| Piston (extended) | Immovable | Immovable |
| Slime / honey block | Pushed + drags adjacent | Pulled + drags adjacent |
| Glazed terracotta | Pushed, not dragged | Pushed, not dragged |
| TNT | Pushed | Pulled |
| Chests, shulkers | Pushed (Java); immovable (Bedrock) | Same |
When a piston extends or retracts, it schedules block updates in a specific order. In Java Edition, this order is deterministic and exploitable. The piston head occupies a block position before the arm block is removed, meaning circuits can react to the head's presence before the full animation completes. This is the basis of 0-tick and quasi-connectivity exploits (most are patched in modern versions).
Each piston extend or retract cycle takes exactly 2 redstone ticks (4 game ticks / ~0.1 s at 20 TPS). Regardless of chain length, the physical animation takes 1 tick to start and completes at the end of the 2nd tick. Circuits that pulse pistons faster than this will drop pulses.
-- Piston timing summary (Java Edition) --
Extend delay: 2 RT (4 GT) from power-on to head fully out
Retract delay: 2 RT (4 GT) from power-off to head fully in
Minimum ON-pulse to extend: 1 RT (2 GT)
Minimum OFF-pulse to retract: 1 RT (2 GT)
RT = redstone tick (0.05 s at 20 TPS)
GT = game tick (0.05 s at 20 TPS, 2 GT = 1 RT)
Slime blocks and honey blocks are the structural glue of flying machines. They share push mechanics but differ in entity interaction and cross-block bonding rules.
When a slime or honey block is pushed or pulled, it attempts to drag every movable block it is directly adjacent to (face, edge, or corner — faces only in Java; faces only in Bedrock too, corners excluded in both). Each dragged block can itself drag its own adjacent blocks, propagating a rigid structure. This propagation still cannot exceed the 12-block total per piston push.
| Property | Slime Block | Honey Block |
|---|---|---|
| Pushes adjacent blocks | Yes | Yes |
| Sticks to each other | Yes | Yes |
| Cross-block sticking (slime + honey) | No — they do NOT stick to each other | |
| Entity bounce | Yes (bounces mobs/players) | No (reduces fall speed) |
| Player sliding | No | Yes (slows on sides) |
| Utility in machines | Structural glue, most common | Isolation between sub-assemblies |
Every block that moves — including the piston head and the slime blocks themselves — counts toward the 12-block limit. When designing a flying machine, sum every block that will be in motion per piston activation. A common mistake is not counting the observer blocks, pistons, or slime blocks within the engine itself.
An observer detects block state changes in the block directly in front of its face and emits a 1-tick pulse from its back. In the context of flying machines, observers detect the piston extension and retraction of adjacent pistons in the structure, creating the self-triggering loop.
The observer's output (arrow face) must be connected to the piston it is triggering, either directly or through the slime-block structure. The observed face points at the piston or block whose state change you want to detect. Misorienting an observer is the most common assembly error.
-- Observer orientation reference --
Observed face → [OBS] → Output face
Placed by looking NORTH:
Observed = block to the SOUTH of observer
Output = NORTH face
Placed by looking UP (ceiling placement):
Observed = block BELOW observer
Output = TOP face (upward)
A flying machine requires a minimum of two pistons — one to push the structure forward and one to pull it (prevent the rear from being left behind). The observer loop provides the alternating clock signal to both.
The canonical minimal design uses two sticky pistons facing the direction of travel, one observer, and two slime blocks. The observer detects the rear piston retracting and fires the front piston; the front piston's extension is detected by the observer, which then fires the rear piston.
| Axis | Piston Faces | Observer Faces | Notes |
|---|---|---|---|
| +X (East) | East | West (watches rear P) | Standard horizontal |
| +Z (South) | South | North | Standard horizontal |
| +Y (Up) | Up | Down | Vertical ascent |
| −Y (Down) | Down | Up | Vertical descent |
A flying machine has no inherent stop state — once started it runs until it hits an immovable block. Practical machines need a way to interrupt the observer loop on demand.
Sticky piston break: Place an additional sticky piston perpendicular to the engine that, when extended, pulls a slime block out of the observer's line of sight, breaking the chain. Retracting it reconnects the chain and the machine continues.
Block insertion stop: A dispenser or piston outside the machine fires a block into the path. The machine hits the block and halts. This is a one-use or reset-required approach.
Detector rail trigger: Place a powered rail or tripwire on the payload platform wired to a sticky piston that intercepts the observer pulse. When the platform reaches the target position, it triggers the interruptor.
Everything not part of the engine is payload. Payload blocks are dragged by slime blocks and must not push the total count past 12 per piston activation.
Each side of a two-piston engine (front push and rear pull) has its own 12-block budget. Blocks dragged by the front piston activation are counted separately from blocks dragged by the rear piston activation. In most symmetric designs, both pistons push/pull the same total, so count one side and verify it applies to both.
-- Example block budget (one piston activation) --
Engine components (always present):
2 × slime blocks = 2
1 × observer = 1
1 × sticky piston body = 1
1 × sticky piston head = 1 (counts separately in Java)
───
Engine subtotal = 5
Available for payload: 12 − 5 = 7 blocks
Each additional slime block you add to increase payload
grip costs 1 block of budget itself.
Each observer added for multi-directional detection = 1 block.
Glazed terracotta is pushed but not dragged by slime blocks. It counts toward the block limit when pushed but does not propagate drag to its neighbors. Use it as a controlled boundary when you want a slime cluster to push a surface without accidentally dragging unintended adjacent blocks.
Two independent engines can be placed side-by-side, each controlling its own 12-block cluster, with honey blocks forming the non-sticky boundary between clusters. Both engines receive the same observer signal (wire the clocks together or use a shared observer). This effectively doubles the movable payload without exceeding per-piston limits.
A bidirectional flying machine travels in both directions along an axis. The simplest approach is a mirrored engine pair — one engine per direction, both dormant until activated.
If both engines start simultaneously (e.g., both observers detect each other's pistons), the machine will oscillate in place or deadlock depending on exact timing. Prevent this by ensuring only one engine is active at a time. The simplest lock is a T flip-flop on each engine's power line: one toggle starts A and disables B; the next starts B and disables A.
A machine can automatically reverse direction by placing a detector (observer, tripwire, or pressure plate on the payload) that fires the opposite engine when the structure reaches the endpoint. Wire the arrival detector to stop the active engine (block insertion or piston intercept) then start the return engine.
Vertical machines follow the same engine logic. The primary engineering differences are gravity and entity standing surface.
Pistons face upward. The engine is structurally identical to a horizontal design rotated 90°. Gravity does not affect blocks held by slime drag — once extended, blocks stay in place until the next retract cycle pulls them up.
Pistons face downward. The observer must fire the pistons in the correct sequence — the front (lower) piston pushes down first, the rear (upper) piston retracts and is then pulled down by slime drag. The timing is the same as horizontal; gravity assists downward movement, which can allow smaller engines.
True diagonal travel (e.g., northeast + up simultaneously) is not achievable with a single engine set. Combine two independent engines — one horizontal, one vertical — both started simultaneously. The result appears diagonal but is actually two interleaved linear motions at potentially different speeds, which means the structure must be able to tolerate asynchronous block updates on both axes.
The core piston and observer physics are conceptually similar across editions, but there are enough implementation differences that a design should be tested on its target edition before deploying at scale.
| Feature | Java Edition | Bedrock Edition |
|---|---|---|
| Quasi-connectivity | Exists (BUD behavior) | Does not exist |
| Block update order | Deterministic per version | Less deterministic, more parallel |
| Chests / shulker boxes movable | Yes (by pistons) | No — immovable |
| Observer pulse length | 1 RT (2 GT) | 1 RT (2 GT) |
| Piston speed | 2 RT extend/retract | 2 RT extend/retract |
| 0-tick pistons | Removed in 1.19+ | Never worked |
| Slime/honey block sticking | Face-adjacent only | Face-adjacent only |
| Moving block entities | Distinct entity during animation | Distinct entity during animation |
| Max push chain | 12 blocks | 12 blocks |
| Parameter | Value |
|---|---|
| Max blocks pushed per piston | 12 |
| Sticky piston retract pull count | 1 block |
| Piston extend delay | 2 RT (4 GT) |
| Piston retract delay | 2 RT (4 GT) |
| Observer output pulse length | 1 RT (2 GT) |
| Slime drag radius | Face-adjacent only |
| Honey drag radius | Face-adjacent only |
| Slime sticks to honey | No |
| Glazed terracotta dragged by slime | No (pushed only) |
| Min engine block count (2-piston) | ~5 blocks per side |
| Available payload budget (2-piston) | ~7 blocks per piston |