World: verify blockstate IDs in setChunk()

I think I've finally traced the source of these problems back to BuilderTools setting bad values in async tasks :)
This commit is contained in:
Dylan K. Taylor 2025-06-21 23:05:51 +01:00
parent 04494e845c
commit 258923cc78
No known key found for this signature in database
GPG Key ID: 8927471A91CAFD3D

View File

@ -2625,6 +2625,16 @@ class World implements ChunkManager{
} }
public function setChunk(int $chunkX, int $chunkZ, Chunk $chunk) : void{ public function setChunk(int $chunkX, int $chunkZ, Chunk $chunk) : void{
foreach($chunk->getSubChunks() as $subChunk){
foreach($subChunk->getBlockLayers() as $blockLayer){
foreach($blockLayer->getPalette() as $blockStateId){
if(!$this->blockStateRegistry->hasStateId($blockStateId)){
throw new \InvalidArgumentException("Provided chunk contains unknown/unregistered blocks (found unknown state ID $blockStateId)");
}
}
}
}
$chunkHash = World::chunkHash($chunkX, $chunkZ); $chunkHash = World::chunkHash($chunkX, $chunkZ);
$oldChunk = $this->loadChunk($chunkX, $chunkZ); $oldChunk = $this->loadChunk($chunkX, $chunkZ);
if($oldChunk !== null && $oldChunk !== $chunk){ if($oldChunk !== null && $oldChunk !== $chunk){