getAllKnownStates() as $index => $block){ if($block->getFullId() !== $index){ $remaps[$index] = $block->getFullId(); }else{ $new[$index] = $block->getName(); } } $oldTable = json_decode(file_get_contents(__DIR__ . '/block_factory_consistency_check.json'), true); if(!is_array($oldTable)){ throw new \pocketmine\utils\AssumptionFailedError("Old table should be array{knownStates: array, remaps: array}"); } $old = $oldTable["knownStates"]; $oldRemaps = $oldTable["remaps"]; foreach($old as $k => $name){ if(!isset($new[$k])){ echo "Removed state for $name (" . ($k >> \pocketmine\block\Block::INTERNAL_METADATA_BITS) . ":" . ($k & \pocketmine\block\Block::INTERNAL_METADATA_MASK) . ")\n"; } } foreach($new as $k => $name){ if(!isset($old[$k])){ echo "Added state for $name (" . ($k >> \pocketmine\block\Block::INTERNAL_METADATA_BITS) . ":" . ($k & \pocketmine\block\Block::INTERNAL_METADATA_MASK) . ")\n"; }elseif($old[$k] !== $name){ echo "Name changed (" . ($k >> \pocketmine\block\Block::INTERNAL_METADATA_BITS) . ":" . ($k & \pocketmine\block\Block::INTERNAL_METADATA_MASK) . "): " . $old[$k] . " -> " . $name . "\n"; } } foreach($oldRemaps as $index => $mapped){ if(!isset($remaps[$index])){ echo "Removed remap of " . ($index >> 4) . ":" . ($index & 0xf) . "\n"; } } foreach($remaps as $index => $mapped){ if(!isset($oldRemaps[$index])){ echo "New remap of " . ($index >> 4) . ":" . ($index & 0xf) . " (" . ($mapped >> 4) . ":" . ($mapped & 0xf) . ") (" . $new[$mapped] . ")\n"; }elseif($oldRemaps[$index] !== $mapped){ echo "Remap changed for " . ($index >> 4) . ":" . ($index & 0xf) . " (" . ($oldRemaps[$index] >> 4) . ":" . ($oldRemaps[$index] & 0xf) . " (" . $old[$oldRemaps[$index]] . ") -> " . ($mapped >> 4) . ":" . ($mapped & 0xf) . " (" . $new[$mapped] . "))\n"; } } file_put_contents(__DIR__ . '/block_factory_consistency_check.json', json_encode( [ "knownStates" => $new, "remaps" => $remaps ], JSON_THROW_ON_ERROR ));