Suppressing Chunk Saves
Suppressing chunk saves with signs prevents a chunk from saving its new state.
Sign text and quantities
Fill all four lines of each sign with 15 characters. A–D below represent independently generated lines, not literal letters. Generate a fresh set for every sign.
| Scheme | Lines on each sign | Signs at first rejected save |
|---|---|---|
| Four varied ASCII lines | A, B, C, D | 17,219–17,261 |
| Two varied ASCII lines | A, B, A, B | 26,471–26,541 |
| Shuffled keyboard letters | Four independently shuffled copies of qwertyuiopasdfg |
23,215–23,269 |
These ranges come from automated tests of 24 cleared chunks in both dimensions. The count depends on the text, layout and other chunk data; test the target chunk rather than assuming a fixed threshold.
Reusing one fixed line throughout the chunk compresses too well. A single fresh line per sign, repeated four times, also falls short in the tested fixtures.
Building and testing
- Back up the world and test on a copy. A rollback loses all chunk changes since the last successful save. Player inventory saves separately.
- Mark one chunk's exact 16×16 footprint. Prepare a chamber with a solid floor near bedrock and room for access. Save the prepared chamber.
- Place signs bottom-up, layer by layer, using the chosen text scheme. Signs can support signs above them. Keep their rotation consistent and all signs inside the same chunk.
- Near the listed count, add signs in small batches. Make a distinctive block change, save, then unload and reload the chunk. If the change disappears, saving is suppressed. Restore the backup between trials as needed.
- Keep the chunk oversized until the intended rollback. Removing enough signs can allow a later save to keep the new state instead.
In singleplayer, leave and reopen the world or change dimension; walking away does not unload the chunk. On a server, other nearby players or spawn retention can prevent unloading.
Preparing text
Save the Python 3 generator below as signtext.py. It produces four lines per sign, with a blank line between signs. Preserve spaces and punctuation when entering the text.
Python text generator
import sys
count = int(sys.argv[1])
mode = sys.argv[2] if len(sys.argv) > 2 else "2"
state = (173 ^ 0x5DEECE66D) & ((1 << 48) - 1)
def next_int(bound):
global state
while True:
state = (state * 0x5DEECE66D + 11) & ((1 << 48) - 1)
bits = state >> 17
if bound & (bound - 1) == 0:
return bound * bits >> 31
value = bits % bound
if bits - value + bound - 1 < (1 << 31):
return value
alphabet = "".join(chr(c) for c in range(32, 127) if c != 96)
assert mode in ("2", "3", "4", "permuted")
for _ in range(count):
if mode == "permuted":
lines = []
for _ in range(4):
chars = list("qwertyuiopasdfg")
for i in range(len(chars) - 1, 0, -1):
j = next_int(i + 1)
chars[i], chars[j] = chars[j], chars[i]
lines.append("".join(chars))
else:
unique = int(mode)
lines = ["".join(alphabet[next_int(94)] for _ in range(15))
for _ in range(unique)]
lines = [lines[i % unique] for i in range(4)]
print("\n".join(lines) + "\n")
python3 signtext.py 18000 4 > four-line-signs.txt
python3 signtext.py 27000 2 > two-line-signs.txt
python3 signtext.py 24000 permuted > shuffled-letter-signs.txt
The quantities provide spare text, not guaranteed thresholds. The vanilla sign editor has no clipboard-paste support; this program prepares text but does not enter it into the game.