mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-08-31 15:31:07 +00:00
the terminology of this needs improvement, but... the basic concept here is that 'type' data will persist on an itemstack, while 'state' data will not. Type data consists of things like: - Colour - Coral type - Wet/dry (sponges) - Live/dead (coral) - Wood type State data consists of things like: - Facing - Axis - Powered/unpowered - Open/closed In the past, with the old system, this information was separated by way of getStateBitmask(). This solution was fraught with problems, but achieved the basic goal: removing unwanted block properties from items.
76 lines
2.8 KiB
PHP
76 lines
2.8 KiB
PHP
<?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 PHPUnit\Framework\TestCase;
|
|
use pocketmine\block\Bed;
|
|
use pocketmine\block\BlockFactory;
|
|
use pocketmine\block\BlockTypeIds;
|
|
use pocketmine\block\Skull;
|
|
use pocketmine\block\utils\DyeColor;
|
|
use pocketmine\data\bedrock\block\BlockStateDeserializeException;
|
|
use pocketmine\data\bedrock\block\BlockStateSerializeException;
|
|
use pocketmine\block\BaseBanner;
|
|
use function print_r;
|
|
|
|
final class BlockSerializerDeserializerTest extends TestCase{
|
|
private BlockStateToBlockObjectDeserializer $deserializer;
|
|
private BlockObjectToBlockStateSerializer $serializer;
|
|
|
|
public function setUp() : void{
|
|
$this->deserializer = new BlockStateToBlockObjectDeserializer();
|
|
$this->serializer = new BlockObjectToBlockStateSerializer();
|
|
}
|
|
|
|
public function testAllKnownBlockStatesSerializableAndDeserializable() : void{
|
|
foreach(BlockFactory::getInstance()->getAllKnownStates() as $block){
|
|
try{
|
|
$blockStateData = $this->serializer->serializeBlock($block);
|
|
}catch(BlockStateSerializeException $e){
|
|
self::fail($e->getMessage());
|
|
}
|
|
try{
|
|
$newBlock = $this->deserializer->deserializeBlock($blockStateData);
|
|
}catch(BlockStateDeserializeException $e){
|
|
self::fail($e->getMessage());
|
|
}
|
|
|
|
//The following are workarounds for differences in blockstate representation in Bedrock vs PM
|
|
//In these cases, some properties are not stored in the blockstate (but rather in the block entity NBT), but
|
|
//they do form part of the internal blockstate hash in PM. This leads to inconsistencies when serializing
|
|
//and deserializing blockstates.
|
|
if(
|
|
($block instanceof BaseBanner && $newBlock instanceof BaseBanner) ||
|
|
($block instanceof Bed && $newBlock instanceof Bed)
|
|
){
|
|
$newBlock->setColor($block->getColor());
|
|
}elseif($block instanceof Skull && $newBlock instanceof Skull){
|
|
$newBlock->setSkullType($block->getSkullType());
|
|
}
|
|
|
|
self::assertSame($block->getStateId(), $newBlock->getStateId(), "Mismatch of blockstate for " . $block->getName() . ", " . print_r($block, true) . " vs " . print_r($newBlock, true));
|
|
}
|
|
}
|
|
}
|