mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-08-21 10:51:24 +00:00
avoid specialising for uncommon case
This commit is contained in:
parent
314277fff8
commit
3783e5e3ae
@ -234,7 +234,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{
|
|||||||
/**
|
/**
|
||||||
* @phpstan-template TBlockType of Block
|
* @phpstan-template TBlockType of Block
|
||||||
* @phpstan-param TBlockType $block
|
* @phpstan-param TBlockType $block
|
||||||
* @phpstan-param \Closure(TBlockType) : (Writer|BlockStateData|string)|Writer|BlockStateData $serializer
|
* @phpstan-param \Closure(TBlockType) : (Writer|BlockStateData)|Writer|BlockStateData $serializer
|
||||||
*/
|
*/
|
||||||
public function map(Block $block, \Closure|Writer|BlockStateData $serializer) : void{
|
public function map(Block $block, \Closure|Writer|BlockStateData $serializer) : void{
|
||||||
if(isset($this->serializers[$block->getTypeId()])){
|
if(isset($this->serializers[$block->getTypeId()])){
|
||||||
@ -284,17 +284,11 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{
|
|||||||
* In the future we'll need some way to guarantee that type IDs are never reused (perhaps spl_object_id()?)
|
* In the future we'll need some way to guarantee that type IDs are never reused (perhaps spl_object_id()?)
|
||||||
*
|
*
|
||||||
* @var \Closure $locatedSerializer
|
* @var \Closure $locatedSerializer
|
||||||
* @phpstan-var \Closure(TBlockType) : (Writer|BlockStateData|string) $locatedSerializer
|
* @phpstan-var \Closure(TBlockType) : (Writer|BlockStateData) $locatedSerializer
|
||||||
*/
|
*/
|
||||||
$result = $locatedSerializer($blockState);
|
$result = $locatedSerializer($blockState);
|
||||||
|
|
||||||
if($result instanceof Writer){ //builder
|
return $result instanceof Writer ? $result->getBlockStateData() : $result;
|
||||||
return $result->getBlockStateData();
|
|
||||||
}
|
|
||||||
if(is_string($result)){ //ID only
|
|
||||||
return BlockStateData::current($result, []);
|
|
||||||
}
|
|
||||||
return $result; //data, no builder
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function registerCandleSerializers() : void{
|
private function registerCandleSerializers() : void{
|
||||||
@ -804,49 +798,61 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private function registerCopperSerializers() : void{
|
private function registerCopperSerializers() : void{
|
||||||
$this->map(Blocks::COPPER(), function(Copper $block) : string{
|
$this->map(Blocks::COPPER(), function(Copper $block) : BlockStateData{
|
||||||
$oxidation = $block->getOxidation();
|
$oxidation = $block->getOxidation();
|
||||||
return $block->isWaxed() ?
|
return BlockStateData::current(
|
||||||
Helper::selectCopperId($oxidation, Ids::WAXED_COPPER, Ids::WAXED_EXPOSED_COPPER, Ids::WAXED_WEATHERED_COPPER, Ids::WAXED_OXIDIZED_COPPER) :
|
$block->isWaxed() ?
|
||||||
Helper::selectCopperId($oxidation, Ids::COPPER_BLOCK, Ids::EXPOSED_COPPER, Ids::WEATHERED_COPPER, Ids::OXIDIZED_COPPER);
|
Helper::selectCopperId($oxidation, Ids::WAXED_COPPER, Ids::WAXED_EXPOSED_COPPER, Ids::WAXED_WEATHERED_COPPER, Ids::WAXED_OXIDIZED_COPPER) :
|
||||||
|
Helper::selectCopperId($oxidation, Ids::COPPER_BLOCK, Ids::EXPOSED_COPPER, Ids::WEATHERED_COPPER, Ids::OXIDIZED_COPPER),
|
||||||
|
[]
|
||||||
|
);
|
||||||
});
|
});
|
||||||
$this->map(Blocks::CHISELED_COPPER(), function(Copper $block) : string{
|
$this->map(Blocks::CHISELED_COPPER(), function(Copper $block) : BlockStateData{
|
||||||
$oxidation = $block->getOxidation();
|
$oxidation = $block->getOxidation();
|
||||||
return $block->isWaxed() ?
|
return BlockStateData::current(
|
||||||
Helper::selectCopperId($oxidation,
|
$block->isWaxed() ?
|
||||||
Ids::WAXED_CHISELED_COPPER,
|
Helper::selectCopperId($oxidation,
|
||||||
Ids::WAXED_EXPOSED_CHISELED_COPPER,
|
Ids::WAXED_CHISELED_COPPER,
|
||||||
Ids::WAXED_WEATHERED_CHISELED_COPPER,
|
Ids::WAXED_EXPOSED_CHISELED_COPPER,
|
||||||
Ids::WAXED_OXIDIZED_CHISELED_COPPER
|
Ids::WAXED_WEATHERED_CHISELED_COPPER,
|
||||||
) :
|
Ids::WAXED_OXIDIZED_CHISELED_COPPER
|
||||||
Helper::selectCopperId($oxidation,
|
) :
|
||||||
Ids::CHISELED_COPPER,
|
Helper::selectCopperId($oxidation,
|
||||||
Ids::EXPOSED_CHISELED_COPPER,
|
Ids::CHISELED_COPPER,
|
||||||
Ids::WEATHERED_CHISELED_COPPER,
|
Ids::EXPOSED_CHISELED_COPPER,
|
||||||
Ids::OXIDIZED_CHISELED_COPPER
|
Ids::WEATHERED_CHISELED_COPPER,
|
||||||
);
|
Ids::OXIDIZED_CHISELED_COPPER
|
||||||
|
),
|
||||||
|
[]
|
||||||
|
);
|
||||||
});
|
});
|
||||||
$this->map(Blocks::COPPER_GRATE(), function(CopperGrate $block) : string{
|
$this->map(Blocks::COPPER_GRATE(), function(CopperGrate $block) : BlockStateData{
|
||||||
$oxidation = $block->getOxidation();
|
$oxidation = $block->getOxidation();
|
||||||
return$block->isWaxed() ?
|
return BlockStateData::current(
|
||||||
Helper::selectCopperId($oxidation,
|
$block->isWaxed() ?
|
||||||
Ids::WAXED_COPPER_GRATE,
|
Helper::selectCopperId($oxidation,
|
||||||
Ids::WAXED_EXPOSED_COPPER_GRATE,
|
Ids::WAXED_COPPER_GRATE,
|
||||||
Ids::WAXED_WEATHERED_COPPER_GRATE,
|
Ids::WAXED_EXPOSED_COPPER_GRATE,
|
||||||
Ids::WAXED_OXIDIZED_COPPER_GRATE
|
Ids::WAXED_WEATHERED_COPPER_GRATE,
|
||||||
) :
|
Ids::WAXED_OXIDIZED_COPPER_GRATE
|
||||||
Helper::selectCopperId($oxidation,
|
) :
|
||||||
Ids::COPPER_GRATE,
|
Helper::selectCopperId($oxidation,
|
||||||
Ids::EXPOSED_COPPER_GRATE,
|
Ids::COPPER_GRATE,
|
||||||
Ids::WEATHERED_COPPER_GRATE,
|
Ids::EXPOSED_COPPER_GRATE,
|
||||||
Ids::OXIDIZED_COPPER_GRATE
|
Ids::WEATHERED_COPPER_GRATE,
|
||||||
);
|
Ids::OXIDIZED_COPPER_GRATE
|
||||||
|
),
|
||||||
|
[]
|
||||||
|
);
|
||||||
});
|
});
|
||||||
$this->map(Blocks::CUT_COPPER(), function(Copper $block) : string{
|
$this->map(Blocks::CUT_COPPER(), function(Copper $block) : BlockStateData{
|
||||||
$oxidation = $block->getOxidation();
|
$oxidation = $block->getOxidation();
|
||||||
return $block->isWaxed() ?
|
return BlockStateData::current(
|
||||||
Helper::selectCopperId($oxidation, Ids::WAXED_CUT_COPPER, Ids::WAXED_EXPOSED_CUT_COPPER, Ids::WAXED_WEATHERED_CUT_COPPER, Ids::WAXED_OXIDIZED_CUT_COPPER) :
|
$block->isWaxed() ?
|
||||||
Helper::selectCopperId($oxidation, Ids::CUT_COPPER, Ids::EXPOSED_CUT_COPPER, Ids::WEATHERED_CUT_COPPER, Ids::OXIDIZED_CUT_COPPER);
|
Helper::selectCopperId($oxidation, Ids::WAXED_CUT_COPPER, Ids::WAXED_EXPOSED_CUT_COPPER, Ids::WAXED_WEATHERED_CUT_COPPER, Ids::WAXED_OXIDIZED_CUT_COPPER) :
|
||||||
|
Helper::selectCopperId($oxidation, Ids::CUT_COPPER, Ids::EXPOSED_CUT_COPPER, Ids::WEATHERED_CUT_COPPER, Ids::OXIDIZED_CUT_COPPER),
|
||||||
|
[]
|
||||||
|
);
|
||||||
});
|
});
|
||||||
$this->map(Blocks::CUT_COPPER_SLAB(), function(CopperSlab $block) : Writer{
|
$this->map(Blocks::CUT_COPPER_SLAB(), function(CopperSlab $block) : Writer{
|
||||||
$oxidation = $block->getOxidation();
|
$oxidation = $block->getOxidation();
|
||||||
@ -1478,13 +1484,11 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{
|
|||||||
$this->mapSlab(Blocks::DIORITE_SLAB(), Ids::DIORITE_SLAB, Ids::DIORITE_DOUBLE_SLAB);
|
$this->mapSlab(Blocks::DIORITE_SLAB(), Ids::DIORITE_SLAB, Ids::DIORITE_DOUBLE_SLAB);
|
||||||
$this->mapStairs(Blocks::DIORITE_STAIRS(), Ids::DIORITE_STAIRS);
|
$this->mapStairs(Blocks::DIORITE_STAIRS(), Ids::DIORITE_STAIRS);
|
||||||
$this->map(Blocks::DIORITE_WALL(), fn(Wall $block) => Helper::encodeWall($block, Writer::create(Ids::DIORITE_WALL)));
|
$this->map(Blocks::DIORITE_WALL(), fn(Wall $block) => Helper::encodeWall($block, Writer::create(Ids::DIORITE_WALL)));
|
||||||
$this->map(Blocks::DIRT(), function(Dirt $block) : string{
|
$this->map(Blocks::DIRT(), fn(Dirt $block) => BlockStateData::current(match($block->getDirtType()){
|
||||||
return match($block->getDirtType()){
|
DirtType::NORMAL => Ids::DIRT,
|
||||||
DirtType::NORMAL => Ids::DIRT,
|
DirtType::COARSE => Ids::COARSE_DIRT,
|
||||||
DirtType::COARSE => Ids::COARSE_DIRT,
|
DirtType::ROOTED => Ids::DIRT_WITH_ROOTS,
|
||||||
DirtType::ROOTED => Ids::DIRT_WITH_ROOTS,
|
}, []));
|
||||||
};
|
|
||||||
});
|
|
||||||
$this->map(Blocks::DOUBLE_TALLGRASS(), fn(DoubleTallGrass $block) => Helper::encodeDoublePlant($block, Writer::create(Ids::TALL_GRASS)));
|
$this->map(Blocks::DOUBLE_TALLGRASS(), fn(DoubleTallGrass $block) => Helper::encodeDoublePlant($block, Writer::create(Ids::TALL_GRASS)));
|
||||||
$this->map(Blocks::ELEMENT_CONSTRUCTOR(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, Writer::create(Ids::ELEMENT_CONSTRUCTOR)));
|
$this->map(Blocks::ELEMENT_CONSTRUCTOR(), fn(ChemistryTable $block) => Helper::encodeChemistryTable($block, Writer::create(Ids::ELEMENT_CONSTRUCTOR)));
|
||||||
$this->map(Blocks::ENDER_CHEST(), function(EnderChest $block) : Writer{
|
$this->map(Blocks::ENDER_CHEST(), function(EnderChest $block) : Writer{
|
||||||
@ -1581,27 +1585,25 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{
|
|||||||
LeverFacing::EAST => StringValues::LEVER_DIRECTION_EAST,
|
LeverFacing::EAST => StringValues::LEVER_DIRECTION_EAST,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
$this->map(Blocks::LIGHT(), function(Light $block) : string{
|
$this->map(Blocks::LIGHT(), fn(Light $block) => BlockStateData::current(match($block->getLightLevel()){
|
||||||
return match($block->getLightLevel()){
|
0 => Ids::LIGHT_BLOCK_0,
|
||||||
0 => Ids::LIGHT_BLOCK_0,
|
1 => Ids::LIGHT_BLOCK_1,
|
||||||
1 => Ids::LIGHT_BLOCK_1,
|
2 => Ids::LIGHT_BLOCK_2,
|
||||||
2 => Ids::LIGHT_BLOCK_2,
|
3 => Ids::LIGHT_BLOCK_3,
|
||||||
3 => Ids::LIGHT_BLOCK_3,
|
4 => Ids::LIGHT_BLOCK_4,
|
||||||
4 => Ids::LIGHT_BLOCK_4,
|
5 => Ids::LIGHT_BLOCK_5,
|
||||||
5 => Ids::LIGHT_BLOCK_5,
|
6 => Ids::LIGHT_BLOCK_6,
|
||||||
6 => Ids::LIGHT_BLOCK_6,
|
7 => Ids::LIGHT_BLOCK_7,
|
||||||
7 => Ids::LIGHT_BLOCK_7,
|
8 => Ids::LIGHT_BLOCK_8,
|
||||||
8 => Ids::LIGHT_BLOCK_8,
|
9 => Ids::LIGHT_BLOCK_9,
|
||||||
9 => Ids::LIGHT_BLOCK_9,
|
10 => Ids::LIGHT_BLOCK_10,
|
||||||
10 => Ids::LIGHT_BLOCK_10,
|
11 => Ids::LIGHT_BLOCK_11,
|
||||||
11 => Ids::LIGHT_BLOCK_11,
|
12 => Ids::LIGHT_BLOCK_12,
|
||||||
12 => Ids::LIGHT_BLOCK_12,
|
13 => Ids::LIGHT_BLOCK_13,
|
||||||
13 => Ids::LIGHT_BLOCK_13,
|
14 => Ids::LIGHT_BLOCK_14,
|
||||||
14 => Ids::LIGHT_BLOCK_14,
|
15 => Ids::LIGHT_BLOCK_15,
|
||||||
15 => Ids::LIGHT_BLOCK_15,
|
default => throw new BlockStateSerializeException("Invalid light level " . $block->getLightLevel()),
|
||||||
default => throw new BlockStateSerializeException("Invalid light level " . $block->getLightLevel()),
|
}, []));
|
||||||
};
|
|
||||||
});
|
|
||||||
$this->map(Blocks::LIGHTNING_ROD(), function(LightningRod $block) : Writer{
|
$this->map(Blocks::LIGHTNING_ROD(), function(LightningRod $block) : Writer{
|
||||||
return Writer::create(Ids::LIGHTNING_ROD)
|
return Writer::create(Ids::LIGHTNING_ROD)
|
||||||
->writeFacingDirection($block->getFacing());
|
->writeFacingDirection($block->getFacing());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user