- New /dimensionalripper teunwhitelist <regname> removes a modded block
entity from the parallel whitelist, restoring its default forced-serial
processing; reports whether it was actually present
- SerDesFilter.unwhitelistModded now returns boolean (removal success)
- README: document whitelist/teunwhitelist commands and clarify the
built-in blacklist is hardcoded, not command-editable
- New client mixin MixinMinecraftPauseDetector: on each Minecraft.runTick, detect integrated-server pause and freeze/unfreeze all dimension loops via DimThreadCore.setPaused, so no worker writes LevelChunk while the main thread is saving/pausing. Fixes reproducible disconnect (packet decode IndexOutOfBounds on ClientboundLevelChunkWithLight) ~0.5s after opening the pause menu.
- LevelTickLoop: add pause()/resume() (cancel next tick, stop self-rescheduling, re-schedule on resume) plus a paused guard at run() entry. Resilient to RejectedExecutionException when the master pool is already shut down.
- ServerManager.setPaused: pause all loops, then wait up to 5s for the in-flight tick to fully settle before returning.
- Keep existing work: TE whitelist command (/dimensionalripper tewhitelist), shard drop counters (entity/TE/chunk-env), POI lock optimization.
- ShardGate: shard entity ticking into per-shard CAS gates so slow shards
skip a tick instead of blocking the whole barrier
- EntityTickParallel: collect entities by stable id into shards, submit via
ShardGate, count missed shards
- FineGrainScheduler: add submitShard path with gate release and barrier
counting
- SectionStorageMixin: replace global exclusive synchronized map with
ConcurrentLong2ObjectMap to remove the POI read lock bottleneck
(~19k villagers: TPS 9 -> 20)
- MasterCommand: add 'fine sharded on|off' toggle and status display
- Add environment setup/launch scripts
killAllLoops() only cancelled the next scheduled tick without waiting for
in-flight dimension ticks to finish. The main thread then ran saveAllChunks
concurrently with worker threads (level.tick -> processUnloads) mutating the
non-thread-safe ChunkMap.toDrop, corrupting the fastutil map and hanging the
save forever.
Add ServerManager.stopLoopsAndWaitIdle() that kills all loops and spins until
each loop isTicking()==false (30s watchdog), and call it first in
MinecraftServerDimMixin.stopServer before killAllLoops(), so dimension ticks
fully finish before the main thread starts saving.