mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-08-20 10:00:31 +00:00
First look at flattened ID specialisation for block serializers
in the future we should be able to unify these, similarly to simple mappings. unifying blocks with states will, however, be considerably more work. only color benefits from this so far
This commit is contained in:
parent
1e8612cfc8
commit
e89523ce66
@ -290,86 +290,72 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{
|
|||||||
return $result instanceof Writer ? $result->getBlockStateData() : $result;
|
return $result instanceof Writer ? $result->getBlockStateData() : $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @phpstan-template TBlock of Block
|
||||||
|
* @phpstan-template TEnum of \UnitEnum
|
||||||
|
*
|
||||||
|
* @phpstan-param TBlock $block
|
||||||
|
* @phpstan-param StringEnumMap<TEnum> $mapProperty
|
||||||
|
* @phpstan-param \Closure(TBlock) : TEnum $getProperty
|
||||||
|
* @phpstan-param ?\Closure(TBlock, Writer) : Writer $extra
|
||||||
|
*/
|
||||||
|
public function mapFlattenedEnum(
|
||||||
|
Block $block,
|
||||||
|
StringEnumMap $mapProperty,
|
||||||
|
string $prefix,
|
||||||
|
string $suffix,
|
||||||
|
\Closure $getProperty,
|
||||||
|
?\Closure $extra = null
|
||||||
|
) : void{
|
||||||
|
$this->map($block, function(Block $block) use ($getProperty, $mapProperty, $prefix, $suffix, $extra) : Writer{
|
||||||
|
$property = $getProperty($block);
|
||||||
|
$infix = $mapProperty->enumToValue($property);
|
||||||
|
$id = $prefix . $infix . $suffix;
|
||||||
|
$writer = new Writer($id);
|
||||||
|
if($extra !== null){
|
||||||
|
$extra($block, $writer);
|
||||||
|
}
|
||||||
|
return $writer;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
private function registerCandleSerializers() : void{
|
private function registerCandleSerializers() : void{
|
||||||
$this->map(Blocks::CANDLE(), fn(Candle $block) => Helper::encodeCandle($block, new Writer(Ids::CANDLE)));
|
$this->map(Blocks::CANDLE(), fn(Candle $block) => Helper::encodeCandle($block, new Writer(Ids::CANDLE)));
|
||||||
$this->map(Blocks::DYED_CANDLE(), fn(DyedCandle $block) => Helper::encodeCandle($block, new Writer(match($block->getColor()){
|
$this->mapFlattenedEnum(
|
||||||
DyeColor::BLACK => Ids::BLACK_CANDLE,
|
Blocks::DYED_CANDLE(),
|
||||||
DyeColor::BLUE => Ids::BLUE_CANDLE,
|
ValueMappings::getInstance()->getEnumMap(DyeColor::class),
|
||||||
DyeColor::BROWN => Ids::BROWN_CANDLE,
|
"minecraft:",
|
||||||
DyeColor::CYAN => Ids::CYAN_CANDLE,
|
"_candle",
|
||||||
DyeColor::GRAY => Ids::GRAY_CANDLE,
|
fn(DyedCandle $block) => $block->getColor(),
|
||||||
DyeColor::GREEN => Ids::GREEN_CANDLE,
|
Helper::encodeCandle(...)
|
||||||
DyeColor::LIGHT_BLUE => Ids::LIGHT_BLUE_CANDLE,
|
);
|
||||||
DyeColor::LIGHT_GRAY => Ids::LIGHT_GRAY_CANDLE,
|
|
||||||
DyeColor::LIME => Ids::LIME_CANDLE,
|
|
||||||
DyeColor::MAGENTA => Ids::MAGENTA_CANDLE,
|
|
||||||
DyeColor::ORANGE => Ids::ORANGE_CANDLE,
|
|
||||||
DyeColor::PINK => Ids::PINK_CANDLE,
|
|
||||||
DyeColor::PURPLE => Ids::PURPLE_CANDLE,
|
|
||||||
DyeColor::RED => Ids::RED_CANDLE,
|
|
||||||
DyeColor::WHITE => Ids::WHITE_CANDLE,
|
|
||||||
DyeColor::YELLOW => Ids::YELLOW_CANDLE,
|
|
||||||
})));
|
|
||||||
$this->map(Blocks::CAKE_WITH_CANDLE(), fn(CakeWithCandle $block) => Writer::create(Ids::CANDLE_CAKE)
|
$this->map(Blocks::CAKE_WITH_CANDLE(), fn(CakeWithCandle $block) => Writer::create(Ids::CANDLE_CAKE)
|
||||||
->writeBool(StateNames::LIT, $block->isLit()));
|
->writeBool(StateNames::LIT, $block->isLit()));
|
||||||
$this->map(Blocks::CAKE_WITH_DYED_CANDLE(), fn(CakeWithDyedCandle $block) => Writer::create(match($block->getColor()){
|
$this->mapFlattenedEnum(
|
||||||
DyeColor::BLACK => Ids::BLACK_CANDLE_CAKE,
|
Blocks::CAKE_WITH_DYED_CANDLE(),
|
||||||
DyeColor::BLUE => Ids::BLUE_CANDLE_CAKE,
|
ValueMappings::getInstance()->getEnumMap(DyeColor::class),
|
||||||
DyeColor::BROWN => Ids::BROWN_CANDLE_CAKE,
|
"minecraft:",
|
||||||
DyeColor::CYAN => Ids::CYAN_CANDLE_CAKE,
|
"_candle_cake",
|
||||||
DyeColor::GRAY => Ids::GRAY_CANDLE_CAKE,
|
fn(CakeWithDyedCandle $block) => $block->getColor(),
|
||||||
DyeColor::GREEN => Ids::GREEN_CANDLE_CAKE,
|
fn(CakeWithDyedCandle $block, Writer $writer) => $writer->writeBool(StateNames::LIT, $block->isLit())
|
||||||
DyeColor::LIGHT_BLUE => Ids::LIGHT_BLUE_CANDLE_CAKE,
|
);
|
||||||
DyeColor::LIGHT_GRAY => Ids::LIGHT_GRAY_CANDLE_CAKE,
|
|
||||||
DyeColor::LIME => Ids::LIME_CANDLE_CAKE,
|
|
||||||
DyeColor::MAGENTA => Ids::MAGENTA_CANDLE_CAKE,
|
|
||||||
DyeColor::ORANGE => Ids::ORANGE_CANDLE_CAKE,
|
|
||||||
DyeColor::PINK => Ids::PINK_CANDLE_CAKE,
|
|
||||||
DyeColor::PURPLE => Ids::PURPLE_CANDLE_CAKE,
|
|
||||||
DyeColor::RED => Ids::RED_CANDLE_CAKE,
|
|
||||||
DyeColor::WHITE => Ids::WHITE_CANDLE_CAKE,
|
|
||||||
DyeColor::YELLOW => Ids::YELLOW_CANDLE_CAKE,
|
|
||||||
})->writeBool(StateNames::LIT, $block->isLit()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function registerFlatColorBlockSerializers() : void{
|
public function registerFlatColorBlockSerializers() : void{
|
||||||
$this->map(Blocks::STAINED_HARDENED_GLASS(), fn(StainedHardenedGlass $block) => BlockStateData::current(match($block->getColor()){
|
$this->mapFlattenedEnum(
|
||||||
DyeColor::BLACK => Ids::HARD_BLACK_STAINED_GLASS,
|
Blocks::STAINED_HARDENED_GLASS(),
|
||||||
DyeColor::BLUE => Ids::HARD_BLUE_STAINED_GLASS,
|
ValueMappings::getInstance()->getEnumMap(DyeColor::class),
|
||||||
DyeColor::BROWN => Ids::HARD_BROWN_STAINED_GLASS,
|
"minecraft:hard_",
|
||||||
DyeColor::CYAN => Ids::HARD_CYAN_STAINED_GLASS,
|
"_stained_glass",
|
||||||
DyeColor::GRAY => Ids::HARD_GRAY_STAINED_GLASS,
|
fn(StainedHardenedGlass $block) => $block->getColor()
|
||||||
DyeColor::GREEN => Ids::HARD_GREEN_STAINED_GLASS,
|
);
|
||||||
DyeColor::LIGHT_BLUE => Ids::HARD_LIGHT_BLUE_STAINED_GLASS,
|
$this->mapFlattenedEnum(
|
||||||
DyeColor::LIGHT_GRAY => Ids::HARD_LIGHT_GRAY_STAINED_GLASS,
|
Blocks::STAINED_HARDENED_GLASS_PANE(),
|
||||||
DyeColor::LIME => Ids::HARD_LIME_STAINED_GLASS,
|
ValueMappings::getInstance()->getEnumMap(DyeColor::class),
|
||||||
DyeColor::MAGENTA => Ids::HARD_MAGENTA_STAINED_GLASS,
|
"minecraft:hard_",
|
||||||
DyeColor::ORANGE => Ids::HARD_ORANGE_STAINED_GLASS,
|
"_stained_glass_pane",
|
||||||
DyeColor::PINK => Ids::HARD_PINK_STAINED_GLASS,
|
fn(StainedHardenedGlassPane $block) => $block->getColor(),
|
||||||
DyeColor::PURPLE => Ids::HARD_PURPLE_STAINED_GLASS,
|
);
|
||||||
DyeColor::RED => Ids::HARD_RED_STAINED_GLASS,
|
|
||||||
DyeColor::WHITE => Ids::HARD_WHITE_STAINED_GLASS,
|
|
||||||
DyeColor::YELLOW => Ids::HARD_YELLOW_STAINED_GLASS,
|
|
||||||
}, []));
|
|
||||||
|
|
||||||
$this->map(Blocks::STAINED_HARDENED_GLASS_PANE(), fn(StainedHardenedGlassPane $block) => BlockStateData::current(match($block->getColor()){
|
|
||||||
DyeColor::BLACK => Ids::HARD_BLACK_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::BLUE => Ids::HARD_BLUE_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::BROWN => Ids::HARD_BROWN_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::CYAN => Ids::HARD_CYAN_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::GRAY => Ids::HARD_GRAY_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::GREEN => Ids::HARD_GREEN_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::LIGHT_BLUE => Ids::HARD_LIGHT_BLUE_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::LIGHT_GRAY => Ids::HARD_LIGHT_GRAY_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::LIME => Ids::HARD_LIME_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::MAGENTA => Ids::HARD_MAGENTA_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::ORANGE => Ids::HARD_ORANGE_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::PINK => Ids::HARD_PINK_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::PURPLE => Ids::HARD_PURPLE_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::RED => Ids::HARD_RED_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::WHITE => Ids::HARD_WHITE_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::YELLOW => Ids::HARD_YELLOW_STAINED_GLASS_PANE,
|
|
||||||
}, []));
|
|
||||||
|
|
||||||
$this->map(Blocks::GLAZED_TERRACOTTA(), function(GlazedTerracotta $block) : Writer{
|
$this->map(Blocks::GLAZED_TERRACOTTA(), function(GlazedTerracotta $block) : Writer{
|
||||||
return Writer::create(match($block->getColor()){
|
return Writer::create(match($block->getColor()){
|
||||||
@ -393,157 +379,67 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{
|
|||||||
->writeHorizontalFacing($block->getFacing());
|
->writeHorizontalFacing($block->getFacing());
|
||||||
});
|
});
|
||||||
|
|
||||||
$this->map(Blocks::WOOL(), fn(Wool $block) => BlockStateData::current(match($block->getColor()){
|
$this->mapFlattenedEnum(
|
||||||
DyeColor::BLACK => Ids::BLACK_WOOL,
|
Blocks::WOOL(),
|
||||||
DyeColor::BLUE => Ids::BLUE_WOOL,
|
ValueMappings::getInstance()->getEnumMap(DyeColor::class),
|
||||||
DyeColor::BROWN => Ids::BROWN_WOOL,
|
"minecraft:",
|
||||||
DyeColor::CYAN => Ids::CYAN_WOOL,
|
"_wool",
|
||||||
DyeColor::GRAY => Ids::GRAY_WOOL,
|
fn(Wool $block) => $block->getColor()
|
||||||
DyeColor::GREEN => Ids::GREEN_WOOL,
|
);
|
||||||
DyeColor::LIGHT_BLUE => Ids::LIGHT_BLUE_WOOL,
|
|
||||||
DyeColor::LIGHT_GRAY => Ids::LIGHT_GRAY_WOOL,
|
|
||||||
DyeColor::LIME => Ids::LIME_WOOL,
|
|
||||||
DyeColor::MAGENTA => Ids::MAGENTA_WOOL,
|
|
||||||
DyeColor::ORANGE => Ids::ORANGE_WOOL,
|
|
||||||
DyeColor::PINK => Ids::PINK_WOOL,
|
|
||||||
DyeColor::PURPLE => Ids::PURPLE_WOOL,
|
|
||||||
DyeColor::RED => Ids::RED_WOOL,
|
|
||||||
DyeColor::WHITE => Ids::WHITE_WOOL,
|
|
||||||
DyeColor::YELLOW => Ids::YELLOW_WOOL,
|
|
||||||
}, []));
|
|
||||||
|
|
||||||
$this->map(Blocks::CARPET(), fn(Carpet $block) => BlockStateData::current(match($block->getColor()){
|
$this->mapFlattenedEnum(
|
||||||
DyeColor::BLACK => Ids::BLACK_CARPET,
|
Blocks::CARPET(),
|
||||||
DyeColor::BLUE => Ids::BLUE_CARPET,
|
ValueMappings::getInstance()->getEnumMap(DyeColor::class),
|
||||||
DyeColor::BROWN => Ids::BROWN_CARPET,
|
"minecraft:",
|
||||||
DyeColor::CYAN => Ids::CYAN_CARPET,
|
"_carpet",
|
||||||
DyeColor::GRAY => Ids::GRAY_CARPET,
|
fn(Carpet $block) => $block->getColor()
|
||||||
DyeColor::GREEN => Ids::GREEN_CARPET,
|
);
|
||||||
DyeColor::LIGHT_BLUE => Ids::LIGHT_BLUE_CARPET,
|
|
||||||
DyeColor::LIGHT_GRAY => Ids::LIGHT_GRAY_CARPET,
|
|
||||||
DyeColor::LIME => Ids::LIME_CARPET,
|
|
||||||
DyeColor::MAGENTA => Ids::MAGENTA_CARPET,
|
|
||||||
DyeColor::ORANGE => Ids::ORANGE_CARPET,
|
|
||||||
DyeColor::PINK => Ids::PINK_CARPET,
|
|
||||||
DyeColor::PURPLE => Ids::PURPLE_CARPET,
|
|
||||||
DyeColor::RED => Ids::RED_CARPET,
|
|
||||||
DyeColor::WHITE => Ids::WHITE_CARPET,
|
|
||||||
DyeColor::YELLOW => Ids::YELLOW_CARPET,
|
|
||||||
}, []));
|
|
||||||
|
|
||||||
$this->map(Blocks::DYED_SHULKER_BOX(), fn(DyedShulkerBox $block) => BlockStateData::current(match($block->getColor()){
|
$this->mapFlattenedEnum(
|
||||||
DyeColor::BLACK => Ids::BLACK_SHULKER_BOX,
|
Blocks::DYED_SHULKER_BOX(),
|
||||||
DyeColor::BLUE => Ids::BLUE_SHULKER_BOX,
|
ValueMappings::getInstance()->getEnumMap(DyeColor::class),
|
||||||
DyeColor::BROWN => Ids::BROWN_SHULKER_BOX,
|
"minecraft:",
|
||||||
DyeColor::CYAN => Ids::CYAN_SHULKER_BOX,
|
"_shulker_box",
|
||||||
DyeColor::GRAY => Ids::GRAY_SHULKER_BOX,
|
fn(DyedShulkerBox $block) => $block->getColor()
|
||||||
DyeColor::GREEN => Ids::GREEN_SHULKER_BOX,
|
);
|
||||||
DyeColor::LIGHT_BLUE => Ids::LIGHT_BLUE_SHULKER_BOX,
|
|
||||||
DyeColor::LIGHT_GRAY => Ids::LIGHT_GRAY_SHULKER_BOX,
|
|
||||||
DyeColor::LIME => Ids::LIME_SHULKER_BOX,
|
|
||||||
DyeColor::MAGENTA => Ids::MAGENTA_SHULKER_BOX,
|
|
||||||
DyeColor::ORANGE => Ids::ORANGE_SHULKER_BOX,
|
|
||||||
DyeColor::PINK => Ids::PINK_SHULKER_BOX,
|
|
||||||
DyeColor::PURPLE => Ids::PURPLE_SHULKER_BOX,
|
|
||||||
DyeColor::RED => Ids::RED_SHULKER_BOX,
|
|
||||||
DyeColor::WHITE => Ids::WHITE_SHULKER_BOX,
|
|
||||||
DyeColor::YELLOW => Ids::YELLOW_SHULKER_BOX,
|
|
||||||
}, []));
|
|
||||||
|
|
||||||
$this->map(Blocks::CONCRETE(), fn(Concrete $block) => BlockStateData::current(match($block->getColor()){
|
$this->mapFlattenedEnum(
|
||||||
DyeColor::BLACK => Ids::BLACK_CONCRETE,
|
Blocks::CONCRETE(),
|
||||||
DyeColor::BLUE => Ids::BLUE_CONCRETE,
|
ValueMappings::getInstance()->getEnumMap(DyeColor::class),
|
||||||
DyeColor::BROWN => Ids::BROWN_CONCRETE,
|
"minecraft:",
|
||||||
DyeColor::CYAN => Ids::CYAN_CONCRETE,
|
"_concrete",
|
||||||
DyeColor::GRAY => Ids::GRAY_CONCRETE,
|
fn(Concrete $block) => $block->getColor()
|
||||||
DyeColor::GREEN => Ids::GREEN_CONCRETE,
|
);
|
||||||
DyeColor::LIGHT_BLUE => Ids::LIGHT_BLUE_CONCRETE,
|
$this->mapFlattenedEnum(
|
||||||
DyeColor::LIGHT_GRAY => Ids::LIGHT_GRAY_CONCRETE,
|
Blocks::CONCRETE_POWDER(),
|
||||||
DyeColor::LIME => Ids::LIME_CONCRETE,
|
ValueMappings::getInstance()->getEnumMap(DyeColor::class),
|
||||||
DyeColor::MAGENTA => Ids::MAGENTA_CONCRETE,
|
"minecraft:",
|
||||||
DyeColor::ORANGE => Ids::ORANGE_CONCRETE,
|
"_concrete_powder",
|
||||||
DyeColor::PINK => Ids::PINK_CONCRETE,
|
fn(ConcretePowder $block) => $block->getColor()
|
||||||
DyeColor::PURPLE => Ids::PURPLE_CONCRETE,
|
);
|
||||||
DyeColor::RED => Ids::RED_CONCRETE,
|
|
||||||
DyeColor::WHITE => Ids::WHITE_CONCRETE,
|
|
||||||
DyeColor::YELLOW => Ids::YELLOW_CONCRETE,
|
|
||||||
}, []));
|
|
||||||
|
|
||||||
$this->map(Blocks::CONCRETE_POWDER(), fn(ConcretePowder $block) => BlockStateData::current(match($block->getColor()){
|
$this->mapFlattenedEnum(
|
||||||
DyeColor::BLACK => Ids::BLACK_CONCRETE_POWDER,
|
Blocks::STAINED_CLAY(),
|
||||||
DyeColor::BLUE => Ids::BLUE_CONCRETE_POWDER,
|
ValueMappings::getInstance()->getEnumMap(DyeColor::class),
|
||||||
DyeColor::BROWN => Ids::BROWN_CONCRETE_POWDER,
|
"minecraft:",
|
||||||
DyeColor::CYAN => Ids::CYAN_CONCRETE_POWDER,
|
"_terracotta",
|
||||||
DyeColor::GRAY => Ids::GRAY_CONCRETE_POWDER,
|
fn(StainedHardenedClay $block) => $block->getColor()
|
||||||
DyeColor::GREEN => Ids::GREEN_CONCRETE_POWDER,
|
);
|
||||||
DyeColor::LIGHT_BLUE => Ids::LIGHT_BLUE_CONCRETE_POWDER,
|
|
||||||
DyeColor::LIGHT_GRAY => Ids::LIGHT_GRAY_CONCRETE_POWDER,
|
|
||||||
DyeColor::LIME => Ids::LIME_CONCRETE_POWDER,
|
|
||||||
DyeColor::MAGENTA => Ids::MAGENTA_CONCRETE_POWDER,
|
|
||||||
DyeColor::ORANGE => Ids::ORANGE_CONCRETE_POWDER,
|
|
||||||
DyeColor::PINK => Ids::PINK_CONCRETE_POWDER,
|
|
||||||
DyeColor::PURPLE => Ids::PURPLE_CONCRETE_POWDER,
|
|
||||||
DyeColor::RED => Ids::RED_CONCRETE_POWDER,
|
|
||||||
DyeColor::WHITE => Ids::WHITE_CONCRETE_POWDER,
|
|
||||||
DyeColor::YELLOW => Ids::YELLOW_CONCRETE_POWDER,
|
|
||||||
}, []));
|
|
||||||
|
|
||||||
$this->map(Blocks::STAINED_CLAY(), fn(StainedHardenedClay $block) => BlockStateData::current(match($block->getColor()){
|
$this->mapFlattenedEnum(
|
||||||
DyeColor::BLACK => Ids::BLACK_TERRACOTTA,
|
Blocks::STAINED_GLASS(),
|
||||||
DyeColor::BLUE => Ids::BLUE_TERRACOTTA,
|
ValueMappings::getInstance()->getEnumMap(DyeColor::class),
|
||||||
DyeColor::BROWN => Ids::BROWN_TERRACOTTA,
|
"minecraft:",
|
||||||
DyeColor::CYAN => Ids::CYAN_TERRACOTTA,
|
"_stained_glass",
|
||||||
DyeColor::GRAY => Ids::GRAY_TERRACOTTA,
|
fn(StainedGlass $block) => $block->getColor()
|
||||||
DyeColor::GREEN => Ids::GREEN_TERRACOTTA,
|
);
|
||||||
DyeColor::LIGHT_BLUE => Ids::LIGHT_BLUE_TERRACOTTA,
|
$this->mapFlattenedEnum(
|
||||||
DyeColor::LIGHT_GRAY => Ids::LIGHT_GRAY_TERRACOTTA,
|
Blocks::STAINED_GLASS_PANE(),
|
||||||
DyeColor::LIME => Ids::LIME_TERRACOTTA,
|
ValueMappings::getInstance()->getEnumMap(DyeColor::class),
|
||||||
DyeColor::MAGENTA => Ids::MAGENTA_TERRACOTTA,
|
"minecraft:",
|
||||||
DyeColor::ORANGE => Ids::ORANGE_TERRACOTTA,
|
"_stained_glass_pane",
|
||||||
DyeColor::PINK => Ids::PINK_TERRACOTTA,
|
fn(StainedGlassPane $block) => $block->getColor()
|
||||||
DyeColor::PURPLE => Ids::PURPLE_TERRACOTTA,
|
);
|
||||||
DyeColor::RED => Ids::RED_TERRACOTTA,
|
|
||||||
DyeColor::WHITE => Ids::WHITE_TERRACOTTA,
|
|
||||||
DyeColor::YELLOW => Ids::YELLOW_TERRACOTTA,
|
|
||||||
}, []));
|
|
||||||
|
|
||||||
$this->map(Blocks::STAINED_GLASS(), fn(StainedGlass $block) => BlockStateData::current(match($block->getColor()){
|
|
||||||
DyeColor::BLACK => Ids::BLACK_STAINED_GLASS,
|
|
||||||
DyeColor::BLUE => Ids::BLUE_STAINED_GLASS,
|
|
||||||
DyeColor::BROWN => Ids::BROWN_STAINED_GLASS,
|
|
||||||
DyeColor::CYAN => Ids::CYAN_STAINED_GLASS,
|
|
||||||
DyeColor::GRAY => Ids::GRAY_STAINED_GLASS,
|
|
||||||
DyeColor::GREEN => Ids::GREEN_STAINED_GLASS,
|
|
||||||
DyeColor::LIGHT_BLUE => Ids::LIGHT_BLUE_STAINED_GLASS,
|
|
||||||
DyeColor::LIGHT_GRAY => Ids::LIGHT_GRAY_STAINED_GLASS,
|
|
||||||
DyeColor::LIME => Ids::LIME_STAINED_GLASS,
|
|
||||||
DyeColor::MAGENTA => Ids::MAGENTA_STAINED_GLASS,
|
|
||||||
DyeColor::ORANGE => Ids::ORANGE_STAINED_GLASS,
|
|
||||||
DyeColor::PINK => Ids::PINK_STAINED_GLASS,
|
|
||||||
DyeColor::PURPLE => Ids::PURPLE_STAINED_GLASS,
|
|
||||||
DyeColor::RED => Ids::RED_STAINED_GLASS,
|
|
||||||
DyeColor::WHITE => Ids::WHITE_STAINED_GLASS,
|
|
||||||
DyeColor::YELLOW => Ids::YELLOW_STAINED_GLASS,
|
|
||||||
}, []));
|
|
||||||
|
|
||||||
$this->map(Blocks::STAINED_GLASS_PANE(), fn(StainedGlassPane $block) => BlockStateData::current(match($block->getColor()){
|
|
||||||
DyeColor::BLACK => Ids::BLACK_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::BLUE => Ids::BLUE_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::BROWN => Ids::BROWN_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::CYAN => Ids::CYAN_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::GRAY => Ids::GRAY_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::GREEN => Ids::GREEN_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::LIGHT_BLUE => Ids::LIGHT_BLUE_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::LIGHT_GRAY => Ids::LIGHT_GRAY_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::LIME => Ids::LIME_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::MAGENTA => Ids::MAGENTA_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::ORANGE => Ids::ORANGE_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::PINK => Ids::PINK_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::PURPLE => Ids::PURPLE_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::RED => Ids::RED_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::WHITE => Ids::WHITE_STAINED_GLASS_PANE,
|
|
||||||
DyeColor::YELLOW => Ids::YELLOW_STAINED_GLASS_PANE,
|
|
||||||
}, []));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function registerFlatCoralSerializers() : void{
|
private function registerFlatCoralSerializers() : void{
|
||||||
|
@ -27,6 +27,7 @@ use pocketmine\block\AmethystCluster;
|
|||||||
use pocketmine\block\Anvil;
|
use pocketmine\block\Anvil;
|
||||||
use pocketmine\block\Bamboo;
|
use pocketmine\block\Bamboo;
|
||||||
use pocketmine\block\Block;
|
use pocketmine\block\Block;
|
||||||
|
use pocketmine\block\CakeWithDyedCandle;
|
||||||
use pocketmine\block\CaveVines;
|
use pocketmine\block\CaveVines;
|
||||||
use pocketmine\block\ChorusFlower;
|
use pocketmine\block\ChorusFlower;
|
||||||
use pocketmine\block\DoublePitcherCrop;
|
use pocketmine\block\DoublePitcherCrop;
|
||||||
@ -157,97 +158,68 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{
|
|||||||
$this->map($strippedId, fn(Reader $in) => Helper::decodeLog($getBlock(), true, $in));
|
$this->map($strippedId, fn(Reader $in) => Helper::decodeLog($getBlock(), true, $in));
|
||||||
}
|
}
|
||||||
|
|
||||||
private function registerCandleDeserializers() : void{
|
/**
|
||||||
$this->map(Ids::CANDLE, fn(Reader $in) => Helper::decodeCandle(Blocks::CANDLE(), $in));
|
* @phpstan-template TBlock of Block
|
||||||
foreach([
|
* @phpstan-template TEnum of \UnitEnum
|
||||||
Ids::BLACK_CANDLE => DyeColor::BLACK,
|
*
|
||||||
Ids::BLUE_CANDLE => DyeColor::BLUE,
|
* @phpstan-param StringEnumMap<TEnum> $mapProperty
|
||||||
Ids::BROWN_CANDLE => DyeColor::BROWN,
|
* @phpstan-param \Closure(TEnum) : TBlock $getBlock
|
||||||
Ids::CYAN_CANDLE => DyeColor::CYAN,
|
* @phpstan-param ?\Closure(TBlock, Reader) : TBlock $extra
|
||||||
Ids::GRAY_CANDLE => DyeColor::GRAY,
|
*/
|
||||||
Ids::GREEN_CANDLE => DyeColor::GREEN,
|
public function mapFlattenedEnum(
|
||||||
Ids::LIGHT_BLUE_CANDLE => DyeColor::LIGHT_BLUE,
|
StringEnumMap $mapProperty,
|
||||||
Ids::LIGHT_GRAY_CANDLE => DyeColor::LIGHT_GRAY,
|
string $prefix,
|
||||||
Ids::LIME_CANDLE => DyeColor::LIME,
|
string $suffix,
|
||||||
Ids::MAGENTA_CANDLE => DyeColor::MAGENTA,
|
\Closure $getBlock,
|
||||||
Ids::ORANGE_CANDLE => DyeColor::ORANGE,
|
?\Closure $extra = null
|
||||||
Ids::PINK_CANDLE => DyeColor::PINK,
|
) : void{
|
||||||
Ids::PURPLE_CANDLE => DyeColor::PURPLE,
|
foreach(Utils::stringifyKeys($mapProperty->getValueToEnum()) as $infix => $enumCase){
|
||||||
Ids::RED_CANDLE => DyeColor::RED,
|
$id = $prefix . $infix . $suffix;
|
||||||
Ids::WHITE_CANDLE => DyeColor::WHITE,
|
if($extra === null){
|
||||||
Ids::YELLOW_CANDLE => DyeColor::YELLOW,
|
$this->map($id, fn() => $getBlock($enumCase));
|
||||||
] as $id => $color){
|
}else{
|
||||||
$this->map($id, fn(Reader $in) => Helper::decodeCandle(Blocks::DYED_CANDLE()->setColor($color), $in));
|
$this->map($id, function(Reader $in) use ($enumCase, $getBlock, $extra) : Block{
|
||||||
}
|
$block = $getBlock($enumCase);
|
||||||
|
$extra($block, $in);
|
||||||
$this->map(Ids::CANDLE_CAKE, fn(Reader $in) => Blocks::CAKE_WITH_CANDLE()->setLit($in->readBool(StateNames::LIT)));
|
return $block;
|
||||||
foreach([
|
});
|
||||||
Ids::BLACK_CANDLE_CAKE => DyeColor::BLACK,
|
}
|
||||||
Ids::BLUE_CANDLE_CAKE => DyeColor::BLUE,
|
|
||||||
Ids::BROWN_CANDLE_CAKE => DyeColor::BROWN,
|
|
||||||
Ids::CYAN_CANDLE_CAKE => DyeColor::CYAN,
|
|
||||||
Ids::GRAY_CANDLE_CAKE => DyeColor::GRAY,
|
|
||||||
Ids::GREEN_CANDLE_CAKE => DyeColor::GREEN,
|
|
||||||
Ids::LIGHT_BLUE_CANDLE_CAKE => DyeColor::LIGHT_BLUE,
|
|
||||||
Ids::LIGHT_GRAY_CANDLE_CAKE => DyeColor::LIGHT_GRAY,
|
|
||||||
Ids::LIME_CANDLE_CAKE => DyeColor::LIME,
|
|
||||||
Ids::MAGENTA_CANDLE_CAKE => DyeColor::MAGENTA,
|
|
||||||
Ids::ORANGE_CANDLE_CAKE => DyeColor::ORANGE,
|
|
||||||
Ids::PINK_CANDLE_CAKE => DyeColor::PINK,
|
|
||||||
Ids::PURPLE_CANDLE_CAKE => DyeColor::PURPLE,
|
|
||||||
Ids::RED_CANDLE_CAKE => DyeColor::RED,
|
|
||||||
Ids::WHITE_CANDLE_CAKE => DyeColor::WHITE,
|
|
||||||
Ids::YELLOW_CANDLE_CAKE => DyeColor::YELLOW,
|
|
||||||
] as $id => $color){
|
|
||||||
$this->map($id, fn(Reader $in) => Blocks::CAKE_WITH_DYED_CANDLE()
|
|
||||||
->setColor($color)
|
|
||||||
->setLit($in->readBool(StateNames::LIT))
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function registerFlatColorBlockDeserializers() : void{
|
private function registerCandleDeserializers() : void{
|
||||||
foreach([
|
$this->map(Ids::CANDLE, fn(Reader $in) => Helper::decodeCandle(Blocks::CANDLE(), $in));
|
||||||
Ids::HARD_BLACK_STAINED_GLASS => DyeColor::BLACK,
|
$this->mapFlattenedEnum(
|
||||||
Ids::HARD_BLUE_STAINED_GLASS => DyeColor::BLUE,
|
ValueMappings::getInstance()->getEnumMap(DyeColor::class),
|
||||||
Ids::HARD_BROWN_STAINED_GLASS => DyeColor::BROWN,
|
"minecraft:",
|
||||||
Ids::HARD_CYAN_STAINED_GLASS => DyeColor::CYAN,
|
"_candle",
|
||||||
Ids::HARD_GRAY_STAINED_GLASS => DyeColor::GRAY,
|
fn(DyeColor $color) => Blocks::DYED_CANDLE()->setColor($color),
|
||||||
Ids::HARD_GREEN_STAINED_GLASS => DyeColor::GREEN,
|
Helper::decodeCandle(...)
|
||||||
Ids::HARD_LIGHT_BLUE_STAINED_GLASS => DyeColor::LIGHT_BLUE,
|
);
|
||||||
Ids::HARD_LIGHT_GRAY_STAINED_GLASS => DyeColor::LIGHT_GRAY,
|
|
||||||
Ids::HARD_LIME_STAINED_GLASS => DyeColor::LIME,
|
|
||||||
Ids::HARD_MAGENTA_STAINED_GLASS => DyeColor::MAGENTA,
|
|
||||||
Ids::HARD_ORANGE_STAINED_GLASS => DyeColor::ORANGE,
|
|
||||||
Ids::HARD_PINK_STAINED_GLASS => DyeColor::PINK,
|
|
||||||
Ids::HARD_PURPLE_STAINED_GLASS => DyeColor::PURPLE,
|
|
||||||
Ids::HARD_RED_STAINED_GLASS => DyeColor::RED,
|
|
||||||
Ids::HARD_WHITE_STAINED_GLASS => DyeColor::WHITE,
|
|
||||||
Ids::HARD_YELLOW_STAINED_GLASS => DyeColor::YELLOW,
|
|
||||||
] as $id => $color){
|
|
||||||
$this->map($id, fn(Reader $in) => Blocks::STAINED_HARDENED_GLASS()->setColor($color));
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach([
|
$this->map(Ids::CANDLE_CAKE, fn(Reader $in) => Blocks::CAKE_WITH_CANDLE()->setLit($in->readBool(StateNames::LIT)));
|
||||||
Ids::HARD_BLACK_STAINED_GLASS_PANE => DyeColor::BLACK,
|
$this->mapFlattenedEnum(
|
||||||
Ids::HARD_BLUE_STAINED_GLASS_PANE => DyeColor::BLUE,
|
ValueMappings::getInstance()->getEnumMap(DyeColor::class),
|
||||||
Ids::HARD_BROWN_STAINED_GLASS_PANE => DyeColor::BROWN,
|
"minecraft:",
|
||||||
Ids::HARD_CYAN_STAINED_GLASS_PANE => DyeColor::CYAN,
|
"_candle_cake",
|
||||||
Ids::HARD_GRAY_STAINED_GLASS_PANE => DyeColor::GRAY,
|
fn(DyeColor $color) => Blocks::CAKE_WITH_DYED_CANDLE()->setColor($color),
|
||||||
Ids::HARD_GREEN_STAINED_GLASS_PANE => DyeColor::GREEN,
|
fn(CakeWithDyedCandle $block, Reader $in) => $block->setLit($in->readBool(StateNames::LIT))
|
||||||
Ids::HARD_LIGHT_BLUE_STAINED_GLASS_PANE => DyeColor::LIGHT_BLUE,
|
);
|
||||||
Ids::HARD_LIGHT_GRAY_STAINED_GLASS_PANE => DyeColor::LIGHT_GRAY,
|
}
|
||||||
Ids::HARD_LIME_STAINED_GLASS_PANE => DyeColor::LIME,
|
|
||||||
Ids::HARD_MAGENTA_STAINED_GLASS_PANE => DyeColor::MAGENTA,
|
private function registerFlatColorBlockDeserializers() : void{
|
||||||
Ids::HARD_ORANGE_STAINED_GLASS_PANE => DyeColor::ORANGE,
|
$this->mapFlattenedEnum(
|
||||||
Ids::HARD_PINK_STAINED_GLASS_PANE => DyeColor::PINK,
|
ValueMappings::getInstance()->getEnumMap(DyeColor::class),
|
||||||
Ids::HARD_PURPLE_STAINED_GLASS_PANE => DyeColor::PURPLE,
|
"minecraft:hard_",
|
||||||
Ids::HARD_RED_STAINED_GLASS_PANE => DyeColor::RED,
|
"_stained_glass",
|
||||||
Ids::HARD_WHITE_STAINED_GLASS_PANE => DyeColor::WHITE,
|
fn(DyeColor $color) => Blocks::STAINED_HARDENED_GLASS()->setColor($color)
|
||||||
Ids::HARD_YELLOW_STAINED_GLASS_PANE => DyeColor::YELLOW,
|
);
|
||||||
] as $id => $color){
|
$this->mapFlattenedEnum(
|
||||||
$this->map($id, fn(Reader $in) => Blocks::STAINED_HARDENED_GLASS_PANE()->setColor($color));
|
ValueMappings::getInstance()->getEnumMap(DyeColor::class),
|
||||||
}
|
"minecraft:hard_",
|
||||||
|
"_stained_glass_pane",
|
||||||
|
fn(DyeColor $color) => Blocks::STAINED_HARDENED_GLASS_PANE()->setColor($color)
|
||||||
|
);
|
||||||
|
|
||||||
foreach([
|
foreach([
|
||||||
Ids::BLACK_GLAZED_TERRACOTTA => DyeColor::BLACK,
|
Ids::BLACK_GLAZED_TERRACOTTA => DyeColor::BLACK,
|
||||||
@ -273,110 +245,38 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach([
|
$this->mapFlattenedEnum(
|
||||||
Ids::BLACK_WOOL => DyeColor::BLACK,
|
ValueMappings::getInstance()->getEnumMap(DyeColor::class),
|
||||||
Ids::BLUE_WOOL => DyeColor::BLUE,
|
"minecraft:",
|
||||||
Ids::BROWN_WOOL => DyeColor::BROWN,
|
"_wool",
|
||||||
Ids::CYAN_WOOL => DyeColor::CYAN,
|
fn(DyeColor $color) => Blocks::WOOL()->setColor($color)
|
||||||
Ids::GRAY_WOOL => DyeColor::GRAY,
|
);
|
||||||
Ids::GREEN_WOOL => DyeColor::GREEN,
|
$this->mapFlattenedEnum(
|
||||||
Ids::LIGHT_BLUE_WOOL => DyeColor::LIGHT_BLUE,
|
ValueMappings::getInstance()->getEnumMap(DyeColor::class),
|
||||||
Ids::LIGHT_GRAY_WOOL => DyeColor::LIGHT_GRAY,
|
"minecraft:",
|
||||||
Ids::LIME_WOOL => DyeColor::LIME,
|
"_carpet",
|
||||||
Ids::MAGENTA_WOOL => DyeColor::MAGENTA,
|
fn(DyeColor $color) => Blocks::CARPET()->setColor($color)
|
||||||
Ids::ORANGE_WOOL => DyeColor::ORANGE,
|
);
|
||||||
Ids::PINK_WOOL => DyeColor::PINK,
|
|
||||||
Ids::PURPLE_WOOL => DyeColor::PURPLE,
|
|
||||||
Ids::RED_WOOL => DyeColor::RED,
|
|
||||||
Ids::WHITE_WOOL => DyeColor::WHITE,
|
|
||||||
Ids::YELLOW_WOOL => DyeColor::YELLOW,
|
|
||||||
] as $id => $color){
|
|
||||||
$this->mapSimple($id, fn() => Blocks::WOOL()->setColor($color));
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach([
|
$this->mapFlattenedEnum(
|
||||||
Ids::BLACK_CARPET => DyeColor::BLACK,
|
ValueMappings::getInstance()->getEnumMap(DyeColor::class),
|
||||||
Ids::BLUE_CARPET => DyeColor::BLUE,
|
"minecraft:",
|
||||||
Ids::BROWN_CARPET => DyeColor::BROWN,
|
"_shulker_box",
|
||||||
Ids::CYAN_CARPET => DyeColor::CYAN,
|
fn(DyeColor $color) => Blocks::DYED_SHULKER_BOX()->setColor($color)
|
||||||
Ids::GRAY_CARPET => DyeColor::GRAY,
|
);
|
||||||
Ids::GREEN_CARPET => DyeColor::GREEN,
|
|
||||||
Ids::LIGHT_BLUE_CARPET => DyeColor::LIGHT_BLUE,
|
|
||||||
Ids::LIGHT_GRAY_CARPET => DyeColor::LIGHT_GRAY,
|
|
||||||
Ids::LIME_CARPET => DyeColor::LIME,
|
|
||||||
Ids::MAGENTA_CARPET => DyeColor::MAGENTA,
|
|
||||||
Ids::ORANGE_CARPET => DyeColor::ORANGE,
|
|
||||||
Ids::PINK_CARPET => DyeColor::PINK,
|
|
||||||
Ids::PURPLE_CARPET => DyeColor::PURPLE,
|
|
||||||
Ids::RED_CARPET => DyeColor::RED,
|
|
||||||
Ids::WHITE_CARPET => DyeColor::WHITE,
|
|
||||||
Ids::YELLOW_CARPET => DyeColor::YELLOW,
|
|
||||||
] as $id => $color){
|
|
||||||
$this->mapSimple($id, fn() => Blocks::CARPET()->setColor($color));
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach([
|
$this->mapFlattenedEnum(
|
||||||
Ids::BLACK_SHULKER_BOX => DyeColor::BLACK,
|
ValueMappings::getInstance()->getEnumMap(DyeColor::class),
|
||||||
Ids::BLUE_SHULKER_BOX => DyeColor::BLUE,
|
"minecraft:",
|
||||||
Ids::BROWN_SHULKER_BOX => DyeColor::BROWN,
|
"_concrete",
|
||||||
Ids::CYAN_SHULKER_BOX => DyeColor::CYAN,
|
fn(DyeColor $color) => Blocks::CONCRETE()->setColor($color)
|
||||||
Ids::GRAY_SHULKER_BOX => DyeColor::GRAY,
|
);
|
||||||
Ids::GREEN_SHULKER_BOX => DyeColor::GREEN,
|
$this->mapFlattenedEnum(
|
||||||
Ids::LIGHT_BLUE_SHULKER_BOX => DyeColor::LIGHT_BLUE,
|
ValueMappings::getInstance()->getEnumMap(DyeColor::class),
|
||||||
Ids::LIGHT_GRAY_SHULKER_BOX => DyeColor::LIGHT_GRAY,
|
"minecraft:",
|
||||||
Ids::LIME_SHULKER_BOX => DyeColor::LIME,
|
"_concrete_powder",
|
||||||
Ids::MAGENTA_SHULKER_BOX => DyeColor::MAGENTA,
|
fn(DyeColor $color) => Blocks::CONCRETE_POWDER()->setColor($color)
|
||||||
Ids::ORANGE_SHULKER_BOX => DyeColor::ORANGE,
|
);
|
||||||
Ids::PINK_SHULKER_BOX => DyeColor::PINK,
|
|
||||||
Ids::PURPLE_SHULKER_BOX => DyeColor::PURPLE,
|
|
||||||
Ids::RED_SHULKER_BOX => DyeColor::RED,
|
|
||||||
Ids::WHITE_SHULKER_BOX => DyeColor::WHITE,
|
|
||||||
Ids::YELLOW_SHULKER_BOX => DyeColor::YELLOW,
|
|
||||||
] as $id => $color){
|
|
||||||
$this->mapSimple($id, fn() => Blocks::DYED_SHULKER_BOX()->setColor($color));
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach([
|
|
||||||
Ids::BLACK_CONCRETE => DyeColor::BLACK,
|
|
||||||
Ids::BLUE_CONCRETE => DyeColor::BLUE,
|
|
||||||
Ids::BROWN_CONCRETE => DyeColor::BROWN,
|
|
||||||
Ids::CYAN_CONCRETE => DyeColor::CYAN,
|
|
||||||
Ids::GRAY_CONCRETE => DyeColor::GRAY,
|
|
||||||
Ids::GREEN_CONCRETE => DyeColor::GREEN,
|
|
||||||
Ids::LIGHT_BLUE_CONCRETE => DyeColor::LIGHT_BLUE,
|
|
||||||
Ids::LIGHT_GRAY_CONCRETE => DyeColor::LIGHT_GRAY,
|
|
||||||
Ids::LIME_CONCRETE => DyeColor::LIME,
|
|
||||||
Ids::MAGENTA_CONCRETE => DyeColor::MAGENTA,
|
|
||||||
Ids::ORANGE_CONCRETE => DyeColor::ORANGE,
|
|
||||||
Ids::PINK_CONCRETE => DyeColor::PINK,
|
|
||||||
Ids::PURPLE_CONCRETE => DyeColor::PURPLE,
|
|
||||||
Ids::RED_CONCRETE => DyeColor::RED,
|
|
||||||
Ids::WHITE_CONCRETE => DyeColor::WHITE,
|
|
||||||
Ids::YELLOW_CONCRETE => DyeColor::YELLOW,
|
|
||||||
] as $id => $color){
|
|
||||||
$this->mapSimple($id, fn() => Blocks::CONCRETE()->setColor($color));
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach([
|
|
||||||
Ids::BLACK_CONCRETE_POWDER => DyeColor::BLACK,
|
|
||||||
Ids::BLUE_CONCRETE_POWDER => DyeColor::BLUE,
|
|
||||||
Ids::BROWN_CONCRETE_POWDER => DyeColor::BROWN,
|
|
||||||
Ids::CYAN_CONCRETE_POWDER => DyeColor::CYAN,
|
|
||||||
Ids::GRAY_CONCRETE_POWDER => DyeColor::GRAY,
|
|
||||||
Ids::GREEN_CONCRETE_POWDER => DyeColor::GREEN,
|
|
||||||
Ids::LIGHT_BLUE_CONCRETE_POWDER => DyeColor::LIGHT_BLUE,
|
|
||||||
Ids::LIGHT_GRAY_CONCRETE_POWDER => DyeColor::LIGHT_GRAY,
|
|
||||||
Ids::LIME_CONCRETE_POWDER => DyeColor::LIME,
|
|
||||||
Ids::MAGENTA_CONCRETE_POWDER => DyeColor::MAGENTA,
|
|
||||||
Ids::ORANGE_CONCRETE_POWDER => DyeColor::ORANGE,
|
|
||||||
Ids::PINK_CONCRETE_POWDER => DyeColor::PINK,
|
|
||||||
Ids::PURPLE_CONCRETE_POWDER => DyeColor::PURPLE,
|
|
||||||
Ids::RED_CONCRETE_POWDER => DyeColor::RED,
|
|
||||||
Ids::WHITE_CONCRETE_POWDER => DyeColor::WHITE,
|
|
||||||
Ids::YELLOW_CONCRETE_POWDER => DyeColor::YELLOW,
|
|
||||||
] as $id => $color){
|
|
||||||
$this->mapSimple($id, fn() => Blocks::CONCRETE_POWDER()->setColor($color));
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach([
|
foreach([
|
||||||
Ids::BLACK_TERRACOTTA => DyeColor::BLACK,
|
Ids::BLACK_TERRACOTTA => DyeColor::BLACK,
|
||||||
@ -399,47 +299,19 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{
|
|||||||
$this->mapSimple($id, fn() => Blocks::STAINED_CLAY()->setColor($color));
|
$this->mapSimple($id, fn() => Blocks::STAINED_CLAY()->setColor($color));
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach([
|
$this->mapFlattenedEnum(
|
||||||
Ids::BLACK_STAINED_GLASS => DyeColor::BLACK,
|
ValueMappings::getInstance()->getEnumMap(DyeColor::class),
|
||||||
Ids::BLUE_STAINED_GLASS => DyeColor::BLUE,
|
"minecraft:",
|
||||||
Ids::BROWN_STAINED_GLASS => DyeColor::BROWN,
|
"_stained_glass",
|
||||||
Ids::CYAN_STAINED_GLASS => DyeColor::CYAN,
|
fn(DyeColor $color) => Blocks::STAINED_GLASS()->setColor($color)
|
||||||
Ids::GRAY_STAINED_GLASS => DyeColor::GRAY,
|
);
|
||||||
Ids::GREEN_STAINED_GLASS => DyeColor::GREEN,
|
|
||||||
Ids::LIGHT_BLUE_STAINED_GLASS => DyeColor::LIGHT_BLUE,
|
|
||||||
Ids::LIGHT_GRAY_STAINED_GLASS => DyeColor::LIGHT_GRAY,
|
|
||||||
Ids::LIME_STAINED_GLASS => DyeColor::LIME,
|
|
||||||
Ids::MAGENTA_STAINED_GLASS => DyeColor::MAGENTA,
|
|
||||||
Ids::ORANGE_STAINED_GLASS => DyeColor::ORANGE,
|
|
||||||
Ids::PINK_STAINED_GLASS => DyeColor::PINK,
|
|
||||||
Ids::PURPLE_STAINED_GLASS => DyeColor::PURPLE,
|
|
||||||
Ids::RED_STAINED_GLASS => DyeColor::RED,
|
|
||||||
Ids::WHITE_STAINED_GLASS => DyeColor::WHITE,
|
|
||||||
Ids::YELLOW_STAINED_GLASS => DyeColor::YELLOW,
|
|
||||||
] as $id => $color){
|
|
||||||
$this->mapSimple($id, fn() => Blocks::STAINED_GLASS()->setColor($color));
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach([
|
$this->mapFlattenedEnum(
|
||||||
Ids::BLACK_STAINED_GLASS_PANE => DyeColor::BLACK,
|
ValueMappings::getInstance()->getEnumMap(DyeColor::class),
|
||||||
Ids::BLUE_STAINED_GLASS_PANE => DyeColor::BLUE,
|
"minecraft:",
|
||||||
Ids::BROWN_STAINED_GLASS_PANE => DyeColor::BROWN,
|
"_stained_glass_pane",
|
||||||
Ids::CYAN_STAINED_GLASS_PANE => DyeColor::CYAN,
|
fn(DyeColor $color) => Blocks::STAINED_GLASS_PANE()->setColor($color)
|
||||||
Ids::GRAY_STAINED_GLASS_PANE => DyeColor::GRAY,
|
);
|
||||||
Ids::GREEN_STAINED_GLASS_PANE => DyeColor::GREEN,
|
|
||||||
Ids::LIGHT_BLUE_STAINED_GLASS_PANE => DyeColor::LIGHT_BLUE,
|
|
||||||
Ids::LIGHT_GRAY_STAINED_GLASS_PANE => DyeColor::LIGHT_GRAY,
|
|
||||||
Ids::LIME_STAINED_GLASS_PANE => DyeColor::LIME,
|
|
||||||
Ids::MAGENTA_STAINED_GLASS_PANE => DyeColor::MAGENTA,
|
|
||||||
Ids::ORANGE_STAINED_GLASS_PANE => DyeColor::ORANGE,
|
|
||||||
Ids::PINK_STAINED_GLASS_PANE => DyeColor::PINK,
|
|
||||||
Ids::PURPLE_STAINED_GLASS_PANE => DyeColor::PURPLE,
|
|
||||||
Ids::RED_STAINED_GLASS_PANE => DyeColor::RED,
|
|
||||||
Ids::WHITE_STAINED_GLASS_PANE => DyeColor::WHITE,
|
|
||||||
Ids::YELLOW_STAINED_GLASS_PANE => DyeColor::YELLOW,
|
|
||||||
] as $id => $color){
|
|
||||||
$this->mapSimple($id, fn() => Blocks::STAINED_GLASS_PANE()->setColor($color));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function registerFlatCoralDeserializers() : void{
|
private function registerFlatCoralDeserializers() : void{
|
||||||
|
78
src/data/bedrock/block/convert/StringEnumMap.php
Normal file
78
src/data/bedrock/block/convert/StringEnumMap.php
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* ____ _ _ __ __ _ __ __ ____
|
||||||
|
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
|
||||||
|
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
|
||||||
|
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
|
||||||
|
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* @author PocketMine Team
|
||||||
|
* @link http://www.pocketmine.net/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace pocketmine\data\bedrock\block\convert;
|
||||||
|
|
||||||
|
use pocketmine\data\bedrock\block\BlockStateDeserializeException;
|
||||||
|
use function spl_object_id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @phpstan-template TEnum of \UnitEnum
|
||||||
|
*/
|
||||||
|
class StringEnumMap{
|
||||||
|
/**
|
||||||
|
* @var string[]
|
||||||
|
* @phpstan-var array<int, string>
|
||||||
|
*/
|
||||||
|
private array $enumToValue = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \UnitEnum[]
|
||||||
|
* @phpstan-var array<string, TEnum>
|
||||||
|
*/
|
||||||
|
private array $valueToEnum = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @phpstan-param class-string<TEnum> $class
|
||||||
|
* @phpstan-param \Closure(TEnum) : string $mapper
|
||||||
|
*/
|
||||||
|
public function __construct(
|
||||||
|
private string $class,
|
||||||
|
\Closure $mapper
|
||||||
|
){
|
||||||
|
foreach($class::cases() as $case){
|
||||||
|
$string = $mapper($case);
|
||||||
|
$this->valueToEnum[$string] = $case;
|
||||||
|
$this->enumToValue[spl_object_id($case)] = $string;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @phpstan-param TEnum $enum
|
||||||
|
*/
|
||||||
|
public function enumToValue(\UnitEnum $enum) : string{
|
||||||
|
return $this->enumToValue[spl_object_id($enum)];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function valueToEnum(string $string) : ?\UnitEnum{
|
||||||
|
return $this->valueToEnum[$string] ?? throw new BlockStateDeserializeException("No $this->class enum mapping for \"$string\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return \UnitEnum[]
|
||||||
|
* @phpstan-return array<string, TEnum>
|
||||||
|
*/
|
||||||
|
public function getValueToEnum() : array{
|
||||||
|
return $this->valueToEnum;
|
||||||
|
}
|
||||||
|
}
|
83
src/data/bedrock/block/convert/ValueMappings.php
Normal file
83
src/data/bedrock/block/convert/ValueMappings.php
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* ____ _ _ __ __ _ __ __ ____
|
||||||
|
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
|
||||||
|
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
|
||||||
|
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
|
||||||
|
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* @author PocketMine Team
|
||||||
|
* @link http://www.pocketmine.net/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace pocketmine\data\bedrock\block\convert;
|
||||||
|
|
||||||
|
use pocketmine\block\utils\DyeColor;
|
||||||
|
use pocketmine\utils\SingletonTrait;
|
||||||
|
|
||||||
|
final class ValueMappings{
|
||||||
|
use SingletonTrait; //???
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var StringEnumMap[]
|
||||||
|
* @phpstan-var array<class-string<covariant \UnitEnum>, StringEnumMap<covariant \UnitEnum>>
|
||||||
|
*/
|
||||||
|
private array $enumMappings = [];
|
||||||
|
|
||||||
|
public function __construct(){
|
||||||
|
$this->addEnum(DyeColor::class, fn(DyeColor $case) => match ($case) {
|
||||||
|
DyeColor::BLACK => "black",
|
||||||
|
DyeColor::BLUE => "blue",
|
||||||
|
DyeColor::BROWN => "brown",
|
||||||
|
DyeColor::CYAN => "cyan",
|
||||||
|
DyeColor::GRAY => "gray",
|
||||||
|
DyeColor::GREEN => "green",
|
||||||
|
DyeColor::LIGHT_BLUE => "light_blue",
|
||||||
|
DyeColor::LIGHT_GRAY => "light_gray",
|
||||||
|
DyeColor::LIME => "lime",
|
||||||
|
DyeColor::MAGENTA => "magenta",
|
||||||
|
DyeColor::ORANGE => "orange",
|
||||||
|
DyeColor::PINK => "pink",
|
||||||
|
DyeColor::PURPLE => "purple",
|
||||||
|
DyeColor::RED => "red",
|
||||||
|
DyeColor::WHITE => "white",
|
||||||
|
DyeColor::YELLOW => "yellow"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @phpstan-template TEnum of \UnitEnum
|
||||||
|
* @phpstan-param class-string<TEnum> $class
|
||||||
|
* @phpstan-param \Closure(TEnum): string $mapper
|
||||||
|
*/
|
||||||
|
private function addEnum(string $class, \Closure $mapper) : void{
|
||||||
|
$this->enumMappings[$class] = new StringEnumMap($class, $mapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @phpstan-template TEnum of \UnitEnum
|
||||||
|
* @phpstan-param class-string<TEnum> $class
|
||||||
|
* @phpstan-return StringEnumMap<TEnum>
|
||||||
|
*/
|
||||||
|
public function getEnumMap(string $class) : StringEnumMap{
|
||||||
|
if(!isset($this->enumMappings[$class])){
|
||||||
|
throw new \InvalidArgumentException("No enum mapping found for class: $class");
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @phpstan-var StringEnumMap<TEnum> $map
|
||||||
|
*/
|
||||||
|
$map = $this->enumMappings[$class];
|
||||||
|
return $map;
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user