From 17fdba8f5054ffa1ef2509da480b2cf43dcaf291 Mon Sep 17 00:00:00 2001 From: Bram Otte Date: Fri, 10 Jan 2025 17:44:08 +0100 Subject: [PATCH 1/2] Fix: repeater tick not scheduling at the end of the tick --- crates/redpiler/src/backend/direct/tick.rs | 3 ++- crates/redstone/src/repeater.rs | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/crates/redpiler/src/backend/direct/tick.rs b/crates/redpiler/src/backend/direct/tick.rs index 7561ec59..deb235d0 100644 --- a/crates/redpiler/src/backend/direct/tick.rs +++ b/crates/redpiler/src/backend/direct/tick.rs @@ -16,7 +16,9 @@ impl DirectBackend { if node.powered && !should_be_powered { self.set_node(node_id, false, 0); } else if !node.powered { + self.set_node(node_id, true, 15); if !should_be_powered { + let node = &mut self.nodes[node_id]; schedule_tick( &mut self.scheduler, node_id, @@ -25,7 +27,6 @@ impl DirectBackend { TickPriority::Higher, ); } - self.set_node(node_id, true, 15); } } NodeType::Torch => { diff --git a/crates/redstone/src/repeater.rs b/crates/redstone/src/repeater.rs index ca944031..ecd088af 100644 --- a/crates/redstone/src/repeater.rs +++ b/crates/redstone/src/repeater.rs @@ -95,5 +95,8 @@ pub fn tick(mut rep: RedstoneRepeater, world: &mut impl World, pos: BlockPos) { rep.powered = true; world.set_block(pos, Block::RedstoneRepeater { repeater: rep }); on_state_change(rep, world, pos); + if !should_be_powered { + world.schedule_tick(pos, rep.delay as u32, TickPriority::Higher); + } } } From 42ef6e2349285607083547b2c78cc1093b55d600 Mon Sep 17 00:00:00 2001 From: Bram Otte Date: Fri, 10 Jan 2025 19:12:07 +0100 Subject: [PATCH 2/2] check if there is already a pending tick before scheduling a tick in repeater tick --- crates/redpiler/src/backend/direct/tick.rs | 4 ++-- crates/redstone/src/repeater.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/redpiler/src/backend/direct/tick.rs b/crates/redpiler/src/backend/direct/tick.rs index deb235d0..cd76768e 100644 --- a/crates/redpiler/src/backend/direct/tick.rs +++ b/crates/redpiler/src/backend/direct/tick.rs @@ -17,8 +17,8 @@ impl DirectBackend { self.set_node(node_id, false, 0); } else if !node.powered { self.set_node(node_id, true, 15); - if !should_be_powered { - let node = &mut self.nodes[node_id]; + let node = &mut self.nodes[node_id]; + if !should_be_powered & !node.pending_tick { schedule_tick( &mut self.scheduler, node_id, diff --git a/crates/redstone/src/repeater.rs b/crates/redstone/src/repeater.rs index ecd088af..d382f739 100644 --- a/crates/redstone/src/repeater.rs +++ b/crates/redstone/src/repeater.rs @@ -95,7 +95,7 @@ pub fn tick(mut rep: RedstoneRepeater, world: &mut impl World, pos: BlockPos) { rep.powered = true; world.set_block(pos, Block::RedstoneRepeater { repeater: rep }); on_state_change(rep, world, pos); - if !should_be_powered { + if !should_be_powered && !world.pending_tick_at(pos) { world.schedule_tick(pos, rep.delay as u32, TickPriority::Higher); } }