mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-09-07 18:32:55 +00:00
Reduce global usage in world providers
This commit is contained in:
@ -24,6 +24,9 @@ declare(strict_types=1);
|
||||
namespace pocketmine\world\format\io;
|
||||
|
||||
use pocketmine\data\bedrock\block\BlockStateDeserializeException;
|
||||
use pocketmine\data\bedrock\block\BlockStateDeserializer;
|
||||
use pocketmine\data\bedrock\block\BlockStateSerializer;
|
||||
use pocketmine\data\bedrock\block\upgrade\BlockDataUpgrader;
|
||||
use pocketmine\world\format\io\exception\CorruptedWorldException;
|
||||
use pocketmine\world\format\io\exception\UnsupportedWorldFormatException;
|
||||
use pocketmine\world\format\PalettedBlockArray;
|
||||
@ -33,6 +36,10 @@ use function file_exists;
|
||||
abstract class BaseWorldProvider implements WorldProvider{
|
||||
protected WorldData $worldData;
|
||||
|
||||
protected BlockStateDeserializer $blockStateDeserializer;
|
||||
protected BlockDataUpgrader $blockDataUpgrader;
|
||||
protected BlockStateSerializer $blockStateSerializer;
|
||||
|
||||
public function __construct(
|
||||
protected string $path
|
||||
){
|
||||
@ -40,6 +47,11 @@ abstract class BaseWorldProvider implements WorldProvider{
|
||||
throw new WorldException("World does not exist");
|
||||
}
|
||||
|
||||
//TODO: this should not rely on singletons
|
||||
$this->blockStateDeserializer = GlobalBlockStateHandlers::getDeserializer();
|
||||
$this->blockDataUpgrader = GlobalBlockStateHandlers::getUpgrader();
|
||||
$this->blockStateSerializer = GlobalBlockStateHandlers::getSerializer();
|
||||
|
||||
$this->worldData = $this->loadLevelData();
|
||||
}
|
||||
|
||||
@ -52,24 +64,20 @@ abstract class BaseWorldProvider implements WorldProvider{
|
||||
private function translatePalette(PalettedBlockArray $blockArray) : PalettedBlockArray{
|
||||
$palette = $blockArray->getPalette();
|
||||
|
||||
//TODO: this should be dependency-injected so it can be replaced, but that would break BC
|
||||
//also, we want it to be lazy-loaded ...
|
||||
$blockDataUpgrader = GlobalBlockStateHandlers::getUpgrader();
|
||||
$blockStateDeserializer = GlobalBlockStateHandlers::getDeserializer();
|
||||
$newPalette = [];
|
||||
foreach($palette as $k => $legacyIdMeta){
|
||||
$newStateData = $blockDataUpgrader->upgradeIntIdMeta($legacyIdMeta >> 4, $legacyIdMeta & 0xf);
|
||||
$newStateData = $this->blockDataUpgrader->upgradeIntIdMeta($legacyIdMeta >> 4, $legacyIdMeta & 0xf);
|
||||
if($newStateData === null){
|
||||
//TODO: remember data for unknown states so we can implement them later
|
||||
$newStateData = GlobalBlockStateHandlers::getUnknownBlockStateData();
|
||||
}
|
||||
|
||||
try{
|
||||
$newPalette[$k] = $blockStateDeserializer->deserialize($newStateData);
|
||||
$newPalette[$k] = $this->blockStateDeserializer->deserialize($newStateData);
|
||||
}catch(BlockStateDeserializeException){
|
||||
//TODO: this needs to be logged
|
||||
//TODO: maybe we can remember unknown states for later saving instead of discarding them and destroying maps...
|
||||
$newPalette[$k] = $blockStateDeserializer->deserialize(GlobalBlockStateHandlers::getUnknownBlockStateData());
|
||||
$newPalette[$k] = $this->blockStateDeserializer->deserialize(GlobalBlockStateHandlers::getUnknownBlockStateData());
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user