mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-09-07 18:32:55 +00:00
Merge branch 'stable'
This commit is contained in:
@ -86,6 +86,10 @@ final class ItemTranslator{
|
||||
if(!is_string($oldId) || !is_string($newId)){
|
||||
throw new AssumptionFailedError("Invalid item table format");
|
||||
}
|
||||
if(!isset($legacyStringToIntMap[$oldId])){
|
||||
//new item without a fixed legacy ID - we can't handle this right now
|
||||
continue;
|
||||
}
|
||||
$simpleMappings[$newId] = $legacyStringToIntMap[$oldId];
|
||||
}
|
||||
foreach($legacyStringToIntMap as $stringId => $intId){
|
||||
@ -129,8 +133,9 @@ final class ItemTranslator{
|
||||
}elseif(isset($simpleMappings[$stringId])){
|
||||
$this->simpleCoreToNetMapping[$simpleMappings[$stringId]] = $netId;
|
||||
$this->simpleNetToCoreMapping[$netId] = $simpleMappings[$stringId];
|
||||
}elseif($stringId !== "minecraft:unknown"){
|
||||
throw new \InvalidArgumentException("Unmapped entry " . $stringId);
|
||||
}else{
|
||||
//not all items have a legacy mapping - for now, we only support the ones that do
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -31,6 +31,7 @@ use pocketmine\network\mcpe\protocol\AddEntityPacket;
|
||||
use pocketmine\network\mcpe\protocol\AddItemActorPacket;
|
||||
use pocketmine\network\mcpe\protocol\AddPaintingPacket;
|
||||
use pocketmine\network\mcpe\protocol\AddPlayerPacket;
|
||||
use pocketmine\network\mcpe\protocol\AddVolumeEntityPacket;
|
||||
use pocketmine\network\mcpe\protocol\AdventureSettingsPacket;
|
||||
use pocketmine\network\mcpe\protocol\AnimateEntityPacket;
|
||||
use pocketmine\network\mcpe\protocol\AnimatePacket;
|
||||
@ -130,6 +131,7 @@ use pocketmine\network\mcpe\protocol\PurchaseReceiptPacket;
|
||||
use pocketmine\network\mcpe\protocol\RemoveActorPacket;
|
||||
use pocketmine\network\mcpe\protocol\RemoveEntityPacket;
|
||||
use pocketmine\network\mcpe\protocol\RemoveObjectivePacket;
|
||||
use pocketmine\network\mcpe\protocol\RemoveVolumeEntityPacket;
|
||||
use pocketmine\network\mcpe\protocol\RequestChunkRadiusPacket;
|
||||
use pocketmine\network\mcpe\protocol\ResourcePackChunkDataPacket;
|
||||
use pocketmine\network\mcpe\protocol\ResourcePackChunkRequestPacket;
|
||||
@ -172,6 +174,7 @@ use pocketmine\network\mcpe\protocol\StructureBlockUpdatePacket;
|
||||
use pocketmine\network\mcpe\protocol\StructureTemplateDataRequestPacket;
|
||||
use pocketmine\network\mcpe\protocol\StructureTemplateDataResponsePacket;
|
||||
use pocketmine\network\mcpe\protocol\SubClientLoginPacket;
|
||||
use pocketmine\network\mcpe\protocol\SyncActorPropertyPacket;
|
||||
use pocketmine\network\mcpe\protocol\TakeItemActorPacket;
|
||||
use pocketmine\network\mcpe\protocol\TextPacket;
|
||||
use pocketmine\network\mcpe\protocol\TickSyncPacket;
|
||||
@ -831,4 +834,16 @@ abstract class PacketHandler implements PacketHandlerInterface{
|
||||
public function handleClientboundDebugRenderer(ClientboundDebugRendererPacket $packet) : bool{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function handleSyncActorProperty(SyncActorPropertyPacket $packet) : bool{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function handleAddVolumeEntity(AddVolumeEntityPacket $packet) : bool{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function handleRemoveVolumeEntity(RemoveVolumeEntityPacket $packet) : bool{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -38,6 +38,8 @@ use pocketmine\network\mcpe\protocol\types\PlayerMovementType;
|
||||
use pocketmine\network\mcpe\protocol\types\SpawnSettings;
|
||||
use pocketmine\player\Player;
|
||||
use pocketmine\Server;
|
||||
use pocketmine\VersionInfo;
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* Handler used for the pre-spawn phase of the session.
|
||||
@ -82,13 +84,14 @@ class PreSpawnPacketHandler extends PacketHandler{
|
||||
$pk->lightningLevel = 0;
|
||||
$pk->commandsEnabled = true;
|
||||
$pk->gameRules = [
|
||||
"naturalregeneration" => new BoolGameRule(false) //Hack for client side regeneration
|
||||
"naturalregeneration" => new BoolGameRule(false, false) //Hack for client side regeneration
|
||||
];
|
||||
$pk->experiments = new Experiments([], false);
|
||||
$pk->levelId = "";
|
||||
$pk->worldName = $this->server->getMotd();
|
||||
$pk->itemTable = GlobalItemTypeDictionary::getInstance()->getDictionary()->getEntries(); //TODO: check if this is actually needed
|
||||
$pk->playerMovementSettings = new PlayerMovementSettings(PlayerMovementType::LEGACY, 0, false);
|
||||
$pk->serverSoftwareVersion = sprintf("%s %s", VersionInfo::NAME, VersionInfo::getVersionObj()->getFullVersion(true));
|
||||
$this->session->sendDataPacket($pk);
|
||||
|
||||
$this->session->sendDataPacket(StaticPacketCache::getInstance()->getAvailableActorIdentifiers());
|
||||
|
65
src/network/mcpe/protocol/AddVolumeEntityPacket.php
Normal file
65
src/network/mcpe/protocol/AddVolumeEntityPacket.php
Normal file
@ -0,0 +1,65 @@
|
||||
<?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\network\mcpe\protocol;
|
||||
|
||||
#include <rules/DataPacket.h>
|
||||
|
||||
use pocketmine\nbt\tag\CompoundTag;
|
||||
use pocketmine\nbt\TreeRoot;
|
||||
use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer;
|
||||
use pocketmine\network\mcpe\protocol\serializer\PacketSerializer;
|
||||
|
||||
class AddVolumeEntityPacket extends DataPacket implements ClientboundPacket{
|
||||
public const NETWORK_ID = ProtocolInfo::ADD_VOLUME_ENTITY_PACKET;
|
||||
|
||||
/** @var int */
|
||||
private $entityNetId;
|
||||
/** @var CompoundTag */
|
||||
private $data;
|
||||
|
||||
public static function create(int $entityNetId, CompoundTag $data) : self{
|
||||
$result = new self;
|
||||
$result->entityNetId = $entityNetId;
|
||||
$result->data = $data;
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function getEntityNetId() : int{ return $this->entityNetId; }
|
||||
|
||||
public function getData() : CompoundTag{ return $this->data; }
|
||||
|
||||
protected function decodePayload(PacketSerializer $in) : void{
|
||||
$this->entityNetId = $in->getUnsignedVarInt();
|
||||
$this->data = $in->getNbtCompoundRoot();
|
||||
}
|
||||
|
||||
protected function encodePayload(PacketSerializer $out) : void{
|
||||
$out->putUnsignedVarInt($this->entityNetId);
|
||||
$out->put((new NetworkNbtSerializer())->write(new TreeRoot($this->data)));
|
||||
}
|
||||
|
||||
public function handle(PacketHandlerInterface $handler) : bool{
|
||||
return $handler->handleAddVolumeEntity($this);
|
||||
}
|
||||
}
|
@ -344,4 +344,10 @@ interface PacketHandlerInterface{
|
||||
public function handleFilterText(FilterTextPacket $packet) : bool;
|
||||
|
||||
public function handleClientboundDebugRenderer(ClientboundDebugRendererPacket $packet) : bool;
|
||||
|
||||
public function handleSyncActorProperty(SyncActorPropertyPacket $packet) : bool;
|
||||
|
||||
public function handleAddVolumeEntity(AddVolumeEntityPacket $packet) : bool;
|
||||
|
||||
public function handleRemoveVolumeEntity(RemoveVolumeEntityPacket $packet) : bool;
|
||||
}
|
||||
|
@ -202,6 +202,9 @@ class PacketPool{
|
||||
$this->registerPacket(new ItemComponentPacket());
|
||||
$this->registerPacket(new FilterTextPacket());
|
||||
$this->registerPacket(new ClientboundDebugRendererPacket());
|
||||
$this->registerPacket(new SyncActorPropertyPacket());
|
||||
$this->registerPacket(new AddVolumeEntityPacket());
|
||||
$this->registerPacket(new RemoveVolumeEntityPacket());
|
||||
}
|
||||
|
||||
public function registerPacket(Packet $packet) : void{
|
||||
|
@ -41,11 +41,11 @@ final class ProtocolInfo{
|
||||
*/
|
||||
|
||||
/** Actual Minecraft: PE protocol version */
|
||||
public const CURRENT_PROTOCOL = 431;
|
||||
public const CURRENT_PROTOCOL = 440;
|
||||
/** Current Minecraft PE version reported by the server. This is usually the earliest currently supported version. */
|
||||
public const MINECRAFT_VERSION = 'v1.16.220';
|
||||
public const MINECRAFT_VERSION = 'v1.17.0';
|
||||
/** Version number sent to clients in ping responses. */
|
||||
public const MINECRAFT_VERSION_NETWORK = '1.16.220';
|
||||
public const MINECRAFT_VERSION_NETWORK = '1.17.0';
|
||||
|
||||
public const LOGIN_PACKET = 0x01;
|
||||
public const PLAY_STATUS_PACKET = 0x02;
|
||||
@ -211,5 +211,8 @@ final class ProtocolInfo{
|
||||
public const ITEM_COMPONENT_PACKET = 0xa2;
|
||||
public const FILTER_TEXT_PACKET = 0xa3;
|
||||
public const CLIENTBOUND_DEBUG_RENDERER_PACKET = 0xa4;
|
||||
public const SYNC_ACTOR_PROPERTY_PACKET = 0xa5;
|
||||
public const ADD_VOLUME_ENTITY_PACKET = 0xa6;
|
||||
public const REMOVE_VOLUME_ENTITY_PACKET = 0xa7;
|
||||
|
||||
}
|
||||
|
55
src/network/mcpe/protocol/RemoveVolumeEntityPacket.php
Normal file
55
src/network/mcpe/protocol/RemoveVolumeEntityPacket.php
Normal file
@ -0,0 +1,55 @@
|
||||
<?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\network\mcpe\protocol;
|
||||
|
||||
#include <rules/DataPacket.h>
|
||||
|
||||
use pocketmine\network\mcpe\protocol\serializer\PacketSerializer;
|
||||
|
||||
class RemoveVolumeEntityPacket extends DataPacket{
|
||||
public const NETWORK_ID = ProtocolInfo::REMOVE_VOLUME_ENTITY_PACKET;
|
||||
|
||||
/** @var int */
|
||||
private $entityNetId;
|
||||
|
||||
public static function create(int $entityNetId) : self{
|
||||
$result = new self;
|
||||
$result->entityNetId = $entityNetId;
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function getEntityNetId() : int{ return $this->entityNetId; }
|
||||
|
||||
protected function decodePayload(PacketSerializer $in) : void{
|
||||
$this->entityNetId = $in->getUnsignedVarInt();
|
||||
}
|
||||
|
||||
protected function encodePayload(PacketSerializer $out) : void{
|
||||
$out->putUnsignedVarInt($this->entityNetId);
|
||||
}
|
||||
|
||||
public function handle(PacketHandlerInterface $handler) : bool{
|
||||
return $handler->handleRemoveVolumeEntity($this);
|
||||
}
|
||||
}
|
@ -163,6 +163,8 @@ class StartGamePacket extends DataPacket implements ClientboundPacket{
|
||||
public $multiplayerCorrelationId = ""; //TODO: this should be filled with a UUID of some sort
|
||||
/** @var bool */
|
||||
public $enableNewInventorySystem = false; //TODO
|
||||
/** @var string */
|
||||
public $serverSoftwareVersion;
|
||||
|
||||
/**
|
||||
* @var BlockPaletteEntry[]
|
||||
@ -256,6 +258,7 @@ class StartGamePacket extends DataPacket implements ClientboundPacket{
|
||||
|
||||
$this->multiplayerCorrelationId = $in->getString();
|
||||
$this->enableNewInventorySystem = $in->getBool();
|
||||
$this->serverSoftwareVersion = $in->getString();
|
||||
}
|
||||
|
||||
protected function encodePayload(PacketSerializer $out) : void{
|
||||
@ -336,6 +339,7 @@ class StartGamePacket extends DataPacket implements ClientboundPacket{
|
||||
|
||||
$out->putString($this->multiplayerCorrelationId);
|
||||
$out->putBool($this->enableNewInventorySystem);
|
||||
$out->putString($this->serverSoftwareVersion);
|
||||
}
|
||||
|
||||
public function handle(PacketHandlerInterface $handler) : bool{
|
||||
|
58
src/network/mcpe/protocol/SyncActorPropertyPacket.php
Normal file
58
src/network/mcpe/protocol/SyncActorPropertyPacket.php
Normal file
@ -0,0 +1,58 @@
|
||||
<?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\network\mcpe\protocol;
|
||||
|
||||
#include <rules/DataPacket.h>
|
||||
|
||||
use pocketmine\nbt\tag\CompoundTag;
|
||||
use pocketmine\nbt\TreeRoot;
|
||||
use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer;
|
||||
use pocketmine\network\mcpe\protocol\serializer\PacketSerializer;
|
||||
|
||||
class SyncActorPropertyPacket extends DataPacket{
|
||||
public const NETWORK_ID = ProtocolInfo::SYNC_ACTOR_PROPERTY_PACKET;
|
||||
|
||||
/** @var CompoundTag */
|
||||
private $data;
|
||||
|
||||
public static function create(CompoundTag $data) : self{
|
||||
$result = new self;
|
||||
$result->data = $data;
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function getData() : CompoundTag{ return $this->data; }
|
||||
|
||||
protected function decodePayload(PacketSerializer $in) : void{
|
||||
$this->data = $in->getNbtCompoundRoot();
|
||||
}
|
||||
|
||||
protected function encodePayload(PacketSerializer $out) : void{
|
||||
$out->put((new NetworkNbtSerializer())->write(new TreeRoot($this->data)));
|
||||
}
|
||||
|
||||
public function handle(PacketHandlerInterface $handler) : bool{
|
||||
return $handler->handleSyncActorProperty($this);
|
||||
}
|
||||
}
|
@ -597,11 +597,11 @@ class PacketSerializer extends BinaryStream{
|
||||
$this->putByte((int) ($rotation / (360 / 256)));
|
||||
}
|
||||
|
||||
private function readGameRule(int $type) : GameRule{
|
||||
private function readGameRule(int $type, bool $isPlayerModifiable) : GameRule{
|
||||
switch($type){
|
||||
case GameRuleType::BOOL: return BoolGameRule::decode($this);
|
||||
case GameRuleType::INT: return IntGameRule::decode($this);
|
||||
case GameRuleType::FLOAT: return FloatGameRule::decode($this);
|
||||
case GameRuleType::BOOL: return BoolGameRule::decode($this, $isPlayerModifiable);
|
||||
case GameRuleType::INT: return IntGameRule::decode($this, $isPlayerModifiable);
|
||||
case GameRuleType::FLOAT: return FloatGameRule::decode($this, $isPlayerModifiable);
|
||||
default:
|
||||
throw new PacketDecodeException("Unknown gamerule type $type");
|
||||
}
|
||||
@ -621,8 +621,9 @@ class PacketSerializer extends BinaryStream{
|
||||
$rules = [];
|
||||
for($i = 0; $i < $count; ++$i){
|
||||
$name = $this->getString();
|
||||
$isPlayerModifiable = $this->getBool();
|
||||
$type = $this->getUnsignedVarInt();
|
||||
$rules[$name] = $this->readGameRule($type);
|
||||
$rules[$name] = $this->readGameRule($type, $isPlayerModifiable);
|
||||
}
|
||||
|
||||
return $rules;
|
||||
@ -638,6 +639,7 @@ class PacketSerializer extends BinaryStream{
|
||||
$this->putUnsignedVarInt(count($rules));
|
||||
foreach($rules as $name => $rule){
|
||||
$this->putString($name);
|
||||
$this->putBool($rule->isPlayerModifiable());
|
||||
$this->putUnsignedVarInt($rule->getType());
|
||||
$rule->encode($this);
|
||||
}
|
||||
|
@ -30,7 +30,8 @@ final class BoolGameRule extends GameRule{
|
||||
/** @var bool */
|
||||
private $value;
|
||||
|
||||
public function __construct(bool $value){
|
||||
public function __construct(bool $value, bool $isPlayerModifiable){
|
||||
parent::__construct($isPlayerModifiable);
|
||||
$this->value = $value;
|
||||
}
|
||||
|
||||
@ -46,7 +47,7 @@ final class BoolGameRule extends GameRule{
|
||||
$out->putBool($this->value);
|
||||
}
|
||||
|
||||
public static function decode(PacketSerializer $in) : self{
|
||||
return new self($in->getBool());
|
||||
public static function decode(PacketSerializer $in, bool $isPlayerModifiable) : self{
|
||||
return new self($in->getBool(), $isPlayerModifiable);
|
||||
}
|
||||
}
|
||||
|
@ -29,7 +29,8 @@ final class FloatGameRule extends GameRule{
|
||||
/** @var float */
|
||||
private $value;
|
||||
|
||||
public function __construct(float $value){
|
||||
public function __construct(float $value, bool $isPlayerModifiable){
|
||||
parent::__construct($isPlayerModifiable);
|
||||
$this->value = $value;
|
||||
}
|
||||
|
||||
@ -45,7 +46,7 @@ final class FloatGameRule extends GameRule{
|
||||
$out->putLFloat($this->value);
|
||||
}
|
||||
|
||||
public static function decode(PacketSerializer $in) : self{
|
||||
return new self($in->getLFloat());
|
||||
public static function decode(PacketSerializer $in, bool $isPlayerModifiable) : self{
|
||||
return new self($in->getLFloat(), $isPlayerModifiable);
|
||||
}
|
||||
}
|
||||
|
@ -27,6 +27,14 @@ use pocketmine\network\mcpe\protocol\serializer\PacketSerializer;
|
||||
|
||||
abstract class GameRule{
|
||||
|
||||
private bool $playerModifiable;
|
||||
|
||||
public function __construct(bool $isPlayerModifiable){
|
||||
$this->playerModifiable = $isPlayerModifiable;
|
||||
}
|
||||
|
||||
public function isPlayerModifiable() : bool{ return $this->playerModifiable; }
|
||||
|
||||
abstract public function getType() : int;
|
||||
|
||||
abstract public function encode(PacketSerializer $out) : void;
|
||||
|
@ -30,7 +30,8 @@ final class IntGameRule extends GameRule{
|
||||
/** @var int */
|
||||
private $value;
|
||||
|
||||
public function __construct(int $value){
|
||||
public function __construct(int $value, bool $isPlayerModifiable){
|
||||
parent::__construct($isPlayerModifiable);
|
||||
$this->value = $value;
|
||||
}
|
||||
|
||||
@ -46,7 +47,7 @@ final class IntGameRule extends GameRule{
|
||||
$out->putUnsignedVarInt($this->value);
|
||||
}
|
||||
|
||||
public static function decode(PacketSerializer $in) : self{
|
||||
return new self($in->getUnsignedVarInt());
|
||||
public static function decode(PacketSerializer $in, bool $isPlayerModifiable) : self{
|
||||
return new self($in->getUnsignedVarInt(), $isPlayerModifiable);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user