Suppressing Chunk Saves

From the Minecraft Beta 1.7.3 Wiki

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

  1. Back up the world and test on a copy. A rollback loses all chunk changes since the last successful save. Player inventory saves separately.
  2. 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.
  3. 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.
  4. 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.
  5. 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.