mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-07-21 10:26:38 +00:00
Rename RuntimeBlockMapping -> BlockTranslator
This commit is contained in:
parent
01f340985a
commit
32e6fdd95a
@ -32,7 +32,7 @@ use pocketmine\utils\AssumptionFailedError;
|
|||||||
/**
|
/**
|
||||||
* @internal
|
* @internal
|
||||||
*/
|
*/
|
||||||
final class RuntimeBlockMapping{
|
final class BlockTranslator{
|
||||||
/**
|
/**
|
||||||
* @var int[]
|
* @var int[]
|
||||||
* @phpstan-var array<int, int>
|
* @phpstan-var array<int, int>
|
@ -58,7 +58,7 @@ class TypeConverter{
|
|||||||
private const RECIPE_INPUT_WILDCARD_META = 0x7fff;
|
private const RECIPE_INPUT_WILDCARD_META = 0x7fff;
|
||||||
|
|
||||||
private BlockItemIdMap $blockItemIdMap;
|
private BlockItemIdMap $blockItemIdMap;
|
||||||
private RuntimeBlockMapping $blockTranslator;
|
private BlockTranslator $blockTranslator;
|
||||||
private ItemTranslator $itemTranslator;
|
private ItemTranslator $itemTranslator;
|
||||||
private ItemTypeDictionary $itemTypeDictionary;
|
private ItemTypeDictionary $itemTypeDictionary;
|
||||||
private int $shieldRuntimeId;
|
private int $shieldRuntimeId;
|
||||||
@ -69,7 +69,7 @@ class TypeConverter{
|
|||||||
|
|
||||||
$canonicalBlockStatesRaw = Filesystem::fileGetContents(BedrockDataFiles::CANONICAL_BLOCK_STATES_NBT);
|
$canonicalBlockStatesRaw = Filesystem::fileGetContents(BedrockDataFiles::CANONICAL_BLOCK_STATES_NBT);
|
||||||
$metaMappingRaw = Filesystem::fileGetContents(BedrockDataFiles::BLOCK_STATE_META_MAP_JSON);
|
$metaMappingRaw = Filesystem::fileGetContents(BedrockDataFiles::BLOCK_STATE_META_MAP_JSON);
|
||||||
$this->blockTranslator = new RuntimeBlockMapping(
|
$this->blockTranslator = new BlockTranslator(
|
||||||
BlockStateDictionary::loadFromString($canonicalBlockStatesRaw, $metaMappingRaw),
|
BlockStateDictionary::loadFromString($canonicalBlockStatesRaw, $metaMappingRaw),
|
||||||
GlobalBlockStateHandlers::getSerializer()
|
GlobalBlockStateHandlers::getSerializer()
|
||||||
);
|
);
|
||||||
@ -85,7 +85,7 @@ class TypeConverter{
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getBlockTranslator() : RuntimeBlockMapping{ return $this->blockTranslator; }
|
public function getBlockTranslator() : BlockTranslator{ return $this->blockTranslator; }
|
||||||
|
|
||||||
public function getItemTypeDictionary() : ItemTypeDictionary{ return $this->itemTypeDictionary; }
|
public function getItemTypeDictionary() : ItemTypeDictionary{ return $this->itemTypeDictionary; }
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ use pocketmine\block\tile\Spawnable;
|
|||||||
use pocketmine\data\bedrock\BiomeIds;
|
use pocketmine\data\bedrock\BiomeIds;
|
||||||
use pocketmine\data\bedrock\LegacyBiomeIdToStringIdMap;
|
use pocketmine\data\bedrock\LegacyBiomeIdToStringIdMap;
|
||||||
use pocketmine\nbt\TreeRoot;
|
use pocketmine\nbt\TreeRoot;
|
||||||
use pocketmine\network\mcpe\convert\RuntimeBlockMapping;
|
use pocketmine\network\mcpe\convert\BlockTranslator;
|
||||||
use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer;
|
use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer;
|
||||||
use pocketmine\network\mcpe\protocol\serializer\PacketSerializer;
|
use pocketmine\network\mcpe\protocol\serializer\PacketSerializer;
|
||||||
use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext;
|
use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext;
|
||||||
@ -58,13 +58,13 @@ final class ChunkSerializer{
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function serializeFullChunk(Chunk $chunk, RuntimeBlockMapping $blockMapper, PacketSerializerContext $encoderContext, ?string $tiles = null) : string{
|
public static function serializeFullChunk(Chunk $chunk, BlockTranslator $blockTranslator, PacketSerializerContext $encoderContext, ?string $tiles = null) : string{
|
||||||
$stream = PacketSerializer::encoder($encoderContext);
|
$stream = PacketSerializer::encoder($encoderContext);
|
||||||
|
|
||||||
$subChunkCount = self::getSubChunkCount($chunk);
|
$subChunkCount = self::getSubChunkCount($chunk);
|
||||||
$writtenCount = 0;
|
$writtenCount = 0;
|
||||||
for($y = Chunk::MIN_SUBCHUNK_INDEX; $writtenCount < $subChunkCount; ++$y, ++$writtenCount){
|
for($y = Chunk::MIN_SUBCHUNK_INDEX; $writtenCount < $subChunkCount; ++$y, ++$writtenCount){
|
||||||
self::serializeSubChunk($chunk->getSubChunk($y), $blockMapper, $stream, false);
|
self::serializeSubChunk($chunk->getSubChunk($y), $blockTranslator, $stream, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
$biomeIdMap = LegacyBiomeIdToStringIdMap::getInstance();
|
$biomeIdMap = LegacyBiomeIdToStringIdMap::getInstance();
|
||||||
@ -84,13 +84,13 @@ final class ChunkSerializer{
|
|||||||
return $stream->getBuffer();
|
return $stream->getBuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function serializeSubChunk(SubChunk $subChunk, RuntimeBlockMapping $blockMapper, PacketSerializer $stream, bool $persistentBlockStates) : void{
|
public static function serializeSubChunk(SubChunk $subChunk, BlockTranslator $blockTranslator, PacketSerializer $stream, bool $persistentBlockStates) : void{
|
||||||
$layers = $subChunk->getBlockLayers();
|
$layers = $subChunk->getBlockLayers();
|
||||||
$stream->putByte(8); //version
|
$stream->putByte(8); //version
|
||||||
|
|
||||||
$stream->putByte(count($layers));
|
$stream->putByte(count($layers));
|
||||||
|
|
||||||
$blockStateDictionary = $blockMapper->getBlockStateDictionary();
|
$blockStateDictionary = $blockTranslator->getBlockStateDictionary();
|
||||||
|
|
||||||
foreach($layers as $blocks){
|
foreach($layers as $blocks){
|
||||||
$bitsPerBlock = $blocks->getBitsPerBlock();
|
$bitsPerBlock = $blocks->getBitsPerBlock();
|
||||||
@ -109,16 +109,16 @@ final class ChunkSerializer{
|
|||||||
$nbtSerializer = new NetworkNbtSerializer();
|
$nbtSerializer = new NetworkNbtSerializer();
|
||||||
foreach($palette as $p){
|
foreach($palette as $p){
|
||||||
//TODO: introduce a binary cache for this
|
//TODO: introduce a binary cache for this
|
||||||
$state = $blockStateDictionary->getDataFromStateId($blockMapper->toRuntimeId($p));
|
$state = $blockStateDictionary->getDataFromStateId($blockTranslator->toRuntimeId($p));
|
||||||
if($state === null){
|
if($state === null){
|
||||||
$state = $blockMapper->getFallbackStateData();
|
$state = $blockTranslator->getFallbackStateData();
|
||||||
}
|
}
|
||||||
|
|
||||||
$stream->put($nbtSerializer->write(new TreeRoot($state->toNbt())));
|
$stream->put($nbtSerializer->write(new TreeRoot($state->toNbt())));
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
foreach($palette as $p){
|
foreach($palette as $p){
|
||||||
$stream->put(Binary::writeUnsignedVarInt($blockMapper->toRuntimeId($p) << 1));
|
$stream->put(Binary::writeUnsignedVarInt($blockTranslator->toRuntimeId($p) << 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1062,7 +1062,7 @@ class World implements ChunkManager{
|
|||||||
public function createBlockUpdatePackets(array $blocks) : array{
|
public function createBlockUpdatePackets(array $blocks) : array{
|
||||||
$packets = [];
|
$packets = [];
|
||||||
|
|
||||||
$blockMapping = TypeConverter::getInstance()->getBlockTranslator();
|
$blockTranslator = TypeConverter::getInstance()->getBlockTranslator();
|
||||||
|
|
||||||
foreach($blocks as $b){
|
foreach($blocks as $b){
|
||||||
if(!($b instanceof Vector3)){
|
if(!($b instanceof Vector3)){
|
||||||
@ -1074,7 +1074,7 @@ class World implements ChunkManager{
|
|||||||
|
|
||||||
$tile = $this->getTileAt($b->x, $b->y, $b->z);
|
$tile = $this->getTileAt($b->x, $b->y, $b->z);
|
||||||
if($tile instanceof Spawnable && count($fakeStateProperties = $tile->getRenderUpdateBugWorkaroundStateProperties($fullBlock)) > 0){
|
if($tile instanceof Spawnable && count($fakeStateProperties = $tile->getRenderUpdateBugWorkaroundStateProperties($fullBlock)) > 0){
|
||||||
$originalStateData = $blockMapping->toStateData($fullBlock->getStateId());
|
$originalStateData = $blockTranslator->toStateData($fullBlock->getStateId());
|
||||||
$fakeStateData = new BlockStateData(
|
$fakeStateData = new BlockStateData(
|
||||||
$originalStateData->getName(),
|
$originalStateData->getName(),
|
||||||
array_merge($originalStateData->getStates(), $fakeStateProperties),
|
array_merge($originalStateData->getStates(), $fakeStateProperties),
|
||||||
@ -1082,14 +1082,14 @@ class World implements ChunkManager{
|
|||||||
);
|
);
|
||||||
$packets[] = UpdateBlockPacket::create(
|
$packets[] = UpdateBlockPacket::create(
|
||||||
$blockPosition,
|
$blockPosition,
|
||||||
$blockMapping->getBlockStateDictionary()->lookupStateIdFromData($fakeStateData) ?? throw new AssumptionFailedError("Unmapped fake blockstate data: " . $fakeStateData->toNbt()),
|
$blockTranslator->getBlockStateDictionary()->lookupStateIdFromData($fakeStateData) ?? throw new AssumptionFailedError("Unmapped fake blockstate data: " . $fakeStateData->toNbt()),
|
||||||
UpdateBlockPacket::FLAG_NETWORK,
|
UpdateBlockPacket::FLAG_NETWORK,
|
||||||
UpdateBlockPacket::DATA_LAYER_NORMAL
|
UpdateBlockPacket::DATA_LAYER_NORMAL
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
$packets[] = UpdateBlockPacket::create(
|
$packets[] = UpdateBlockPacket::create(
|
||||||
$blockPosition,
|
$blockPosition,
|
||||||
$blockMapping->toRuntimeId($fullBlock->getStateId()),
|
$blockTranslator->toRuntimeId($fullBlock->getStateId()),
|
||||||
UpdateBlockPacket::FLAG_NETWORK,
|
UpdateBlockPacket::FLAG_NETWORK,
|
||||||
UpdateBlockPacket::DATA_LAYER_NORMAL
|
UpdateBlockPacket::DATA_LAYER_NORMAL
|
||||||
);
|
);
|
||||||
|
@ -26,7 +26,7 @@ namespace pocketmine\network\mcpe\convert;
|
|||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
use pocketmine\block\RuntimeBlockStateRegistry;
|
use pocketmine\block\RuntimeBlockStateRegistry;
|
||||||
|
|
||||||
class RuntimeBlockMappingTest extends TestCase{
|
class BlockTranslatorTest extends TestCase{
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @doesNotPerformAssertions
|
* @doesNotPerformAssertions
|
@ -39,7 +39,7 @@ use pocketmine\nbt\tag\CompoundTag;
|
|||||||
use pocketmine\nbt\tag\ListTag;
|
use pocketmine\nbt\tag\ListTag;
|
||||||
use pocketmine\nbt\TreeRoot;
|
use pocketmine\nbt\TreeRoot;
|
||||||
use pocketmine\network\mcpe\convert\BlockStateDictionary;
|
use pocketmine\network\mcpe\convert\BlockStateDictionary;
|
||||||
use pocketmine\network\mcpe\convert\RuntimeBlockMapping;
|
use pocketmine\network\mcpe\convert\BlockTranslator;
|
||||||
use pocketmine\network\mcpe\handler\PacketHandler;
|
use pocketmine\network\mcpe\handler\PacketHandler;
|
||||||
use pocketmine\network\mcpe\protocol\AvailableActorIdentifiersPacket;
|
use pocketmine\network\mcpe\protocol\AvailableActorIdentifiersPacket;
|
||||||
use pocketmine\network\mcpe\protocol\BiomeDefinitionListPacket;
|
use pocketmine\network\mcpe\protocol\BiomeDefinitionListPacket;
|
||||||
@ -109,10 +109,10 @@ require dirname(__DIR__) . '/vendor/autoload.php';
|
|||||||
class ParserPacketHandler extends PacketHandler{
|
class ParserPacketHandler extends PacketHandler{
|
||||||
|
|
||||||
public ?ItemTypeDictionary $itemTypeDictionary = null;
|
public ?ItemTypeDictionary $itemTypeDictionary = null;
|
||||||
private RuntimeBlockMapping $blockMapping;
|
private BlockTranslator $blockTranslator;
|
||||||
|
|
||||||
public function __construct(private string $bedrockDataPath){
|
public function __construct(private string $bedrockDataPath){
|
||||||
$this->blockMapping = new RuntimeBlockMapping(
|
$this->blockTranslator = new BlockTranslator(
|
||||||
BlockStateDictionary::loadFromString(
|
BlockStateDictionary::loadFromString(
|
||||||
Filesystem::fileGetContents(Path::join($this->bedrockDataPath, "canonical_block_states.nbt")),
|
Filesystem::fileGetContents(Path::join($this->bedrockDataPath, "canonical_block_states.nbt")),
|
||||||
Filesystem::fileGetContents(Path::join($this->bedrockDataPath, "block_state_meta_map.json")),
|
Filesystem::fileGetContents(Path::join($this->bedrockDataPath, "block_state_meta_map.json")),
|
||||||
@ -150,7 +150,7 @@ class ParserPacketHandler extends PacketHandler{
|
|||||||
if($meta !== 0){
|
if($meta !== 0){
|
||||||
throw new PacketHandlingException("Unexpected non-zero blockitem meta");
|
throw new PacketHandlingException("Unexpected non-zero blockitem meta");
|
||||||
}
|
}
|
||||||
$blockState = $this->blockMapping->getBlockStateDictionary()->getDataFromStateId($itemStack->getBlockRuntimeId()) ?? null;
|
$blockState = $this->blockTranslator->getBlockStateDictionary()->getDataFromStateId($itemStack->getBlockRuntimeId()) ?? null;
|
||||||
if($blockState === null){
|
if($blockState === null){
|
||||||
throw new PacketHandlingException("Unmapped blockstate ID " . $itemStack->getBlockRuntimeId());
|
throw new PacketHandlingException("Unmapped blockstate ID " . $itemStack->getBlockRuntimeId());
|
||||||
}
|
}
|
||||||
@ -268,9 +268,9 @@ class ParserPacketHandler extends PacketHandler{
|
|||||||
}
|
}
|
||||||
$meta = $descriptor->getMeta();
|
$meta = $descriptor->getMeta();
|
||||||
if($meta !== 32767){
|
if($meta !== 32767){
|
||||||
$blockStateId = $this->blockMapping->getBlockStateDictionary()->lookupStateIdFromIdMeta($data->name, $meta);
|
$blockStateId = $this->blockTranslator->getBlockStateDictionary()->lookupStateIdFromIdMeta($data->name, $meta);
|
||||||
if($blockStateId !== null){
|
if($blockStateId !== null){
|
||||||
$blockState = $this->blockMapping->getBlockStateDictionary()->getDataFromStateId($blockStateId);
|
$blockState = $this->blockTranslator->getBlockStateDictionary()->getDataFromStateId($blockStateId);
|
||||||
if($blockState !== null && count($blockState->getStates()) > 0){
|
if($blockState !== null && count($blockState->getStates()) > 0){
|
||||||
$data->block_states = self::blockStatePropertiesToString($blockState);
|
$data->block_states = self::blockStatePropertiesToString($blockState);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user