From f2fb995c8488f2db79ae52b2f261bcf1336cd887 Mon Sep 17 00:00:00 2001 From: itsRevela Date: Thu, 26 Mar 2026 10:40:43 -0500 Subject: [PATCH] Fix pistons permanently breaking server-wide on dedicated servers triggerEvent() set ignoreUpdate to true at the start but three early return paths (lines 221, 225, 250) skipped the reset at the end. Once any of these paths was hit (common with fast redstone clocks where the signal state changes between event queuing and processing), the TLS flag stayed true permanently, blocking all piston neighbor updates for the rest of the server session. --- Minecraft.World/PistonBaseTile.cpp | 3 +++ README.md | 3 +++ 2 files changed, 6 insertions(+) diff --git a/Minecraft.World/PistonBaseTile.cpp b/Minecraft.World/PistonBaseTile.cpp index e8e2a713..530cbf73 100644 --- a/Minecraft.World/PistonBaseTile.cpp +++ b/Minecraft.World/PistonBaseTile.cpp @@ -218,10 +218,12 @@ bool PistonBaseTile::triggerEvent(Level *level, int x, int y, int z, int param1, if (extend && param1 == TRIGGER_CONTRACT) { level->setData(x, y, z, facing | EXTENDED_BIT, UPDATE_CLIENTS); + ignoreUpdate(false); return false; } else if (!extend && param1 == TRIGGER_EXTEND) { + ignoreUpdate(false); return false; } } @@ -247,6 +249,7 @@ bool PistonBaseTile::triggerEvent(Level *level, int x, int y, int z, int param1, } else { + ignoreUpdate(false); return false; } PIXEndNamedEvent(); diff --git a/README.md b/README.md index a680e59f..82480868 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,9 @@ This project is based on source code of Minecraft Legacy Console Edition v1.6.05 ## Latest: +Piston fix for dedicated servers: +- Fixed a bug where pistons would permanently break server-wide on dedicated servers when a redstone clock ran long enough. The piston update lock (`ignoreUpdate`) was set at the start of `triggerEvent` but never cleared on three early-return paths, permanently blocking all piston neighbor updates for the rest of the session. A fast clock would eventually hit one of these paths (e.g. signal state changing between event queuing and processing), locking out every piston in the world + Chunk unloading and connection stability fixes: - Fixed a regression where chunks outside the player's immediate vicinity would fail to load on dedicated servers, leaving giant missing areas. The server's chunk drop function was immediately removing chunks from the cache instead of queuing them for the existing save/unload pipeline, which meant chunks were never saved, never moved to the recovery cache, and their entities (item frames, paintings, etc.) were never removed from the level before being reloaded, causing entity duplication - Fixed the server's `dropAll()` and autosave chunk cleanup iterating the loaded chunk list while simultaneously modifying it (undefined behavior that could corrupt chunk tracking or stall the server)