This commit is contained in:
Dylan K. Taylor 2025-08-15 19:47:28 +01:00
parent db880c49a5
commit 390c03f52e
No known key found for this signature in database
GPG Key ID: 8927471A91CAFD3D

View File

@ -272,15 +272,19 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{
throw new BlockStateSerializeException("No serializer registered for " . get_class($blockState) . " with type ID $typeId"); throw new BlockStateSerializeException("No serializer registered for " . get_class($blockState) . " with type ID $typeId");
} }
if($locatedSerializer instanceof BlockStateData){
return $locatedSerializer;
}
/** /**
* TODO: there is no guarantee that this type actually matches that of $blockState - a plugin may have stolen * TODO: there is no guarantee that this type actually matches that of $blockState - a plugin may have stolen
* the type ID of the block (which never makes sense, even in a world where overriding block types is a thing). * the type ID of the block (which never makes sense, even in a world where overriding block types is a thing).
* 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|BlockStateData $locatedSerializer * @var \Closure $locatedSerializer
* @phpstan-var \Closure(TBlockType) : (Writer|BlockStateData)|BlockStateData $locatedSerializer * @phpstan-var \Closure(TBlockType) : (Writer|BlockStateData) $locatedSerializer
*/ */
$writerOrState = $locatedSerializer instanceof \Closure ? $locatedSerializer($blockState) : $locatedSerializer; $writerOrState = $locatedSerializer($blockState);
return $writerOrState instanceof Writer ? $writerOrState->getBlockStateData() : $writerOrState; return $writerOrState instanceof Writer ? $writerOrState->getBlockStateData() : $writerOrState;
} }
@ -328,8 +332,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{
} }
public function registerFlatColorBlockSerializers() : void{ public function registerFlatColorBlockSerializers() : void{
$this->map(Blocks::STAINED_HARDENED_GLASS(), fn(StainedHardenedGlass $block) => $this->map(Blocks::STAINED_HARDENED_GLASS(), fn(StainedHardenedGlass $block) => BlockStateData::current(match($block->getColor()){
BlockStateData::current(match($block->getColor()){
DyeColor::BLACK => Ids::HARD_BLACK_STAINED_GLASS, DyeColor::BLACK => Ids::HARD_BLACK_STAINED_GLASS,
DyeColor::BLUE => Ids::HARD_BLUE_STAINED_GLASS, DyeColor::BLUE => Ids::HARD_BLUE_STAINED_GLASS,
DyeColor::BROWN => Ids::HARD_BROWN_STAINED_GLASS, DyeColor::BROWN => Ids::HARD_BROWN_STAINED_GLASS,
@ -348,8 +351,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{
DyeColor::YELLOW => Ids::HARD_YELLOW_STAINED_GLASS, DyeColor::YELLOW => Ids::HARD_YELLOW_STAINED_GLASS,
}, [])); }, []));
$this->map(Blocks::STAINED_HARDENED_GLASS_PANE(), fn(StainedHardenedGlassPane $block) => $this->map(Blocks::STAINED_HARDENED_GLASS_PANE(), fn(StainedHardenedGlassPane $block) => BlockStateData::current(match($block->getColor()){
BlockStateData::current(match($block->getColor()){
DyeColor::BLACK => Ids::HARD_BLACK_STAINED_GLASS_PANE, DyeColor::BLACK => Ids::HARD_BLACK_STAINED_GLASS_PANE,
DyeColor::BLUE => Ids::HARD_BLUE_STAINED_GLASS_PANE, DyeColor::BLUE => Ids::HARD_BLUE_STAINED_GLASS_PANE,
DyeColor::BROWN => Ids::HARD_BROWN_STAINED_GLASS_PANE, DyeColor::BROWN => Ids::HARD_BROWN_STAINED_GLASS_PANE,
@ -390,8 +392,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{
->writeHorizontalFacing($block->getFacing()); ->writeHorizontalFacing($block->getFacing());
}); });
$this->map(Blocks::WOOL(), fn(Wool $block) => $this->map(Blocks::WOOL(), fn(Wool $block) => BlockStateData::current(match($block->getColor()){
BlockStateData::current(match($block->getColor()){
DyeColor::BLACK => Ids::BLACK_WOOL, DyeColor::BLACK => Ids::BLACK_WOOL,
DyeColor::BLUE => Ids::BLUE_WOOL, DyeColor::BLUE => Ids::BLUE_WOOL,
DyeColor::BROWN => Ids::BROWN_WOOL, DyeColor::BROWN => Ids::BROWN_WOOL,
@ -410,8 +411,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{
DyeColor::YELLOW => Ids::YELLOW_WOOL, DyeColor::YELLOW => Ids::YELLOW_WOOL,
}, [])); }, []));
$this->map(Blocks::CARPET(), fn(Carpet $block) => $this->map(Blocks::CARPET(), fn(Carpet $block) => BlockStateData::current(match($block->getColor()){
BlockStateData::current(match($block->getColor()){
DyeColor::BLACK => Ids::BLACK_CARPET, DyeColor::BLACK => Ids::BLACK_CARPET,
DyeColor::BLUE => Ids::BLUE_CARPET, DyeColor::BLUE => Ids::BLUE_CARPET,
DyeColor::BROWN => Ids::BROWN_CARPET, DyeColor::BROWN => Ids::BROWN_CARPET,
@ -430,8 +430,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{
DyeColor::YELLOW => Ids::YELLOW_CARPET, DyeColor::YELLOW => Ids::YELLOW_CARPET,
}, [])); }, []));
$this->map(Blocks::DYED_SHULKER_BOX(), fn(DyedShulkerBox $block) => $this->map(Blocks::DYED_SHULKER_BOX(), fn(DyedShulkerBox $block) => BlockStateData::current(match($block->getColor()){
BlockStateData::current(match($block->getColor()){
DyeColor::BLACK => Ids::BLACK_SHULKER_BOX, DyeColor::BLACK => Ids::BLACK_SHULKER_BOX,
DyeColor::BLUE => Ids::BLUE_SHULKER_BOX, DyeColor::BLUE => Ids::BLUE_SHULKER_BOX,
DyeColor::BROWN => Ids::BROWN_SHULKER_BOX, DyeColor::BROWN => Ids::BROWN_SHULKER_BOX,
@ -450,8 +449,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{
DyeColor::YELLOW => Ids::YELLOW_SHULKER_BOX, DyeColor::YELLOW => Ids::YELLOW_SHULKER_BOX,
}, [])); }, []));
$this->map(Blocks::CONCRETE(), fn(Concrete $block) => $this->map(Blocks::CONCRETE(), fn(Concrete $block) => BlockStateData::current(match($block->getColor()){
BlockStateData::current(match($block->getColor()){
DyeColor::BLACK => Ids::BLACK_CONCRETE, DyeColor::BLACK => Ids::BLACK_CONCRETE,
DyeColor::BLUE => Ids::BLUE_CONCRETE, DyeColor::BLUE => Ids::BLUE_CONCRETE,
DyeColor::BROWN => Ids::BROWN_CONCRETE, DyeColor::BROWN => Ids::BROWN_CONCRETE,
@ -470,8 +468,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{
DyeColor::YELLOW => Ids::YELLOW_CONCRETE, DyeColor::YELLOW => Ids::YELLOW_CONCRETE,
}, [])); }, []));
$this->map(Blocks::CONCRETE_POWDER(), fn(ConcretePowder $block) => $this->map(Blocks::CONCRETE_POWDER(), fn(ConcretePowder $block) => BlockStateData::current(match($block->getColor()){
BlockStateData::current(match($block->getColor()){
DyeColor::BLACK => Ids::BLACK_CONCRETE_POWDER, DyeColor::BLACK => Ids::BLACK_CONCRETE_POWDER,
DyeColor::BLUE => Ids::BLUE_CONCRETE_POWDER, DyeColor::BLUE => Ids::BLUE_CONCRETE_POWDER,
DyeColor::BROWN => Ids::BROWN_CONCRETE_POWDER, DyeColor::BROWN => Ids::BROWN_CONCRETE_POWDER,
@ -490,8 +487,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{
DyeColor::YELLOW => Ids::YELLOW_CONCRETE_POWDER, DyeColor::YELLOW => Ids::YELLOW_CONCRETE_POWDER,
}, [])); }, []));
$this->map(Blocks::STAINED_CLAY(), fn(StainedHardenedClay $block) => $this->map(Blocks::STAINED_CLAY(), fn(StainedHardenedClay $block) => BlockStateData::current(match($block->getColor()){
BlockStateData::current(match($block->getColor()){
DyeColor::BLACK => Ids::BLACK_TERRACOTTA, DyeColor::BLACK => Ids::BLACK_TERRACOTTA,
DyeColor::BLUE => Ids::BLUE_TERRACOTTA, DyeColor::BLUE => Ids::BLUE_TERRACOTTA,
DyeColor::BROWN => Ids::BROWN_TERRACOTTA, DyeColor::BROWN => Ids::BROWN_TERRACOTTA,
@ -510,8 +506,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{
DyeColor::YELLOW => Ids::YELLOW_TERRACOTTA, DyeColor::YELLOW => Ids::YELLOW_TERRACOTTA,
}, [])); }, []));
$this->map(Blocks::STAINED_GLASS(), fn(StainedGlass $block) => $this->map(Blocks::STAINED_GLASS(), fn(StainedGlass $block) => BlockStateData::current(match($block->getColor()){
BlockStateData::current(match($block->getColor()){
DyeColor::BLACK => Ids::BLACK_STAINED_GLASS, DyeColor::BLACK => Ids::BLACK_STAINED_GLASS,
DyeColor::BLUE => Ids::BLUE_STAINED_GLASS, DyeColor::BLUE => Ids::BLUE_STAINED_GLASS,
DyeColor::BROWN => Ids::BROWN_STAINED_GLASS, DyeColor::BROWN => Ids::BROWN_STAINED_GLASS,
@ -530,8 +525,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{
DyeColor::YELLOW => Ids::YELLOW_STAINED_GLASS, DyeColor::YELLOW => Ids::YELLOW_STAINED_GLASS,
}, [])); }, []));
$this->map(Blocks::STAINED_GLASS_PANE(), fn(StainedGlassPane $block) => $this->map(Blocks::STAINED_GLASS_PANE(), fn(StainedGlassPane $block) => BlockStateData::current(match($block->getColor()){
BlockStateData::current(match($block->getColor()){
DyeColor::BLACK => Ids::BLACK_STAINED_GLASS_PANE, DyeColor::BLACK => Ids::BLACK_STAINED_GLASS_PANE,
DyeColor::BLUE => Ids::BLUE_STAINED_GLASS_PANE, DyeColor::BLUE => Ids::BLUE_STAINED_GLASS_PANE,
DyeColor::BROWN => Ids::BROWN_STAINED_GLASS_PANE, DyeColor::BROWN => Ids::BROWN_STAINED_GLASS_PANE,
@ -552,15 +546,13 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{
} }
private function registerFlatCoralSerializers() : void{ private function registerFlatCoralSerializers() : void{
$this->map(Blocks::CORAL(), fn(Coral $block) => $this->map(Blocks::CORAL(), fn(Coral $block) => BlockStateData::current(match($block->getCoralType()){
BlockStateData::current(match($block->getCoralType()){
CoralType::BRAIN => $block->isDead() ? Ids::DEAD_BRAIN_CORAL : Ids::BRAIN_CORAL, CoralType::BRAIN => $block->isDead() ? Ids::DEAD_BRAIN_CORAL : Ids::BRAIN_CORAL,
CoralType::BUBBLE => $block->isDead() ? Ids::DEAD_BUBBLE_CORAL : Ids::BUBBLE_CORAL, CoralType::BUBBLE => $block->isDead() ? Ids::DEAD_BUBBLE_CORAL : Ids::BUBBLE_CORAL,
CoralType::FIRE => $block->isDead() ? Ids::DEAD_FIRE_CORAL : Ids::FIRE_CORAL, CoralType::FIRE => $block->isDead() ? Ids::DEAD_FIRE_CORAL : Ids::FIRE_CORAL,
CoralType::HORN => $block->isDead() ? Ids::DEAD_HORN_CORAL : Ids::HORN_CORAL, CoralType::HORN => $block->isDead() ? Ids::DEAD_HORN_CORAL : Ids::HORN_CORAL,
CoralType::TUBE => $block->isDead() ? Ids::DEAD_TUBE_CORAL : Ids::TUBE_CORAL, CoralType::TUBE => $block->isDead() ? Ids::DEAD_TUBE_CORAL : Ids::TUBE_CORAL,
}, []) }, []));
);
$this->map(Blocks::CORAL_FAN(), fn(FloorCoralFan $block) => Writer::create( $this->map(Blocks::CORAL_FAN(), fn(FloorCoralFan $block) => Writer::create(
match($block->getCoralType()){ match($block->getCoralType()){
@ -576,15 +568,13 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{
default => throw new BlockStateSerializeException("Invalid axis {$axis}"), default => throw new BlockStateSerializeException("Invalid axis {$axis}"),
})); }));
$this->map(Blocks::CORAL_BLOCK(), fn(CoralBlock $block) => $this->map(Blocks::CORAL_BLOCK(), fn(CoralBlock $block) => BlockStateData::current(match($block->getCoralType()){
BlockStateData::current(match($block->getCoralType()){
CoralType::BRAIN => $block->isDead() ? Ids::DEAD_BRAIN_CORAL_BLOCK : Ids::BRAIN_CORAL_BLOCK, CoralType::BRAIN => $block->isDead() ? Ids::DEAD_BRAIN_CORAL_BLOCK : Ids::BRAIN_CORAL_BLOCK,
CoralType::BUBBLE => $block->isDead() ? Ids::DEAD_BUBBLE_CORAL_BLOCK : Ids::BUBBLE_CORAL_BLOCK, CoralType::BUBBLE => $block->isDead() ? Ids::DEAD_BUBBLE_CORAL_BLOCK : Ids::BUBBLE_CORAL_BLOCK,
CoralType::FIRE => $block->isDead() ? Ids::DEAD_FIRE_CORAL_BLOCK : Ids::FIRE_CORAL_BLOCK, CoralType::FIRE => $block->isDead() ? Ids::DEAD_FIRE_CORAL_BLOCK : Ids::FIRE_CORAL_BLOCK,
CoralType::HORN => $block->isDead() ? Ids::DEAD_HORN_CORAL_BLOCK : Ids::HORN_CORAL_BLOCK, CoralType::HORN => $block->isDead() ? Ids::DEAD_HORN_CORAL_BLOCK : Ids::HORN_CORAL_BLOCK,
CoralType::TUBE => $block->isDead() ? Ids::DEAD_TUBE_CORAL_BLOCK : Ids::TUBE_CORAL_BLOCK, CoralType::TUBE => $block->isDead() ? Ids::DEAD_TUBE_CORAL_BLOCK : Ids::TUBE_CORAL_BLOCK,
}, []) }, []));
);
$this->map(Blocks::WALL_CORAL_FAN(), fn(WallCoralFan $block) => Writer::create( $this->map(Blocks::WALL_CORAL_FAN(), fn(WallCoralFan $block) => Writer::create(
match($block->getCoralType()){ match($block->getCoralType()){