mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-06-07 12:18:46 +00:00
Merge branch 'stable' into next-minor
This commit is contained in:
commit
89e29448ee
14
changelogs/4.9.md
Normal file
14
changelogs/4.9.md
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
**For Minecraft: Bedrock Edition 1.19.30**
|
||||||
|
|
||||||
|
### Note about API versions
|
||||||
|
Plugins which don't touch the protocol and compatible with any previous 4.x.y version will also run on these releases and do not need API bumps.
|
||||||
|
Plugin developers should **only** update their required API to this version if you need the changes in this build.
|
||||||
|
|
||||||
|
**WARNING: If your plugin uses the protocol, you're not shielded by API change constraints.** You should consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you do.
|
||||||
|
|
||||||
|
# 4.9.0
|
||||||
|
Released 20th September 2022.
|
||||||
|
|
||||||
|
## General
|
||||||
|
- Added support for Minecraft: Bedrock Edition 1.19.30.
|
||||||
|
- Removed support for older versions.
|
@ -34,8 +34,8 @@
|
|||||||
"adhocore/json-comment": "^1.1",
|
"adhocore/json-comment": "^1.1",
|
||||||
"fgrosse/phpasn1": "^2.3",
|
"fgrosse/phpasn1": "^2.3",
|
||||||
"netresearch/jsonmapper": "^4.0",
|
"netresearch/jsonmapper": "^4.0",
|
||||||
"pocketmine/bedrock-data": "~1.10.0+bedrock-1.19.20",
|
"pocketmine/bedrock-data": "~1.11.0+bedrock-1.19.30",
|
||||||
"pocketmine/bedrock-protocol": "~12.2.0+bedrock-1.19.20",
|
"pocketmine/bedrock-protocol": "~13.0.0+bedrock-1.19.30",
|
||||||
"pocketmine/binaryutils": "^0.2.1",
|
"pocketmine/binaryutils": "^0.2.1",
|
||||||
"pocketmine/callback-validator": "^1.0.2",
|
"pocketmine/callback-validator": "^1.0.2",
|
||||||
"pocketmine/classloader": "^0.2.0",
|
"pocketmine/classloader": "^0.2.0",
|
||||||
|
38
composer.lock
generated
38
composer.lock
generated
@ -4,7 +4,7 @@
|
|||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "82c3c4f98020c30f8ba31f11211abdc3",
|
"content-hash": "0f6c845836d4ec6f221415d2f9dd1fc5",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "adhocore/json-comment",
|
"name": "adhocore/json-comment",
|
||||||
@ -245,16 +245,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "pocketmine/bedrock-data",
|
"name": "pocketmine/bedrock-data",
|
||||||
"version": "1.10.0+bedrock-1.19.20",
|
"version": "1.11.0+bedrock-1.19.30",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/pmmp/BedrockData.git",
|
"url": "https://github.com/pmmp/BedrockData.git",
|
||||||
"reference": "43610f6749f22d15ede6b60ed5402bdeff47453e"
|
"reference": "2cca1d48421db20740ffd1ce67b40b91acc61187"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/pmmp/BedrockData/zipball/43610f6749f22d15ede6b60ed5402bdeff47453e",
|
"url": "https://api.github.com/repos/pmmp/BedrockData/zipball/2cca1d48421db20740ffd1ce67b40b91acc61187",
|
||||||
"reference": "43610f6749f22d15ede6b60ed5402bdeff47453e",
|
"reference": "2cca1d48421db20740ffd1ce67b40b91acc61187",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
@ -265,22 +265,22 @@
|
|||||||
"description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP",
|
"description": "Blobs of data generated from Minecraft: Bedrock Edition, used by PocketMine-MP",
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/pmmp/BedrockData/issues",
|
"issues": "https://github.com/pmmp/BedrockData/issues",
|
||||||
"source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.19.20"
|
"source": "https://github.com/pmmp/BedrockData/tree/bedrock-1.19.30"
|
||||||
},
|
},
|
||||||
"time": "2022-08-09T17:44:22+00:00"
|
"time": "2022-09-20T18:19:22+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "pocketmine/bedrock-protocol",
|
"name": "pocketmine/bedrock-protocol",
|
||||||
"version": "12.2.0+bedrock-1.19.21",
|
"version": "13.0.0+bedrock-1.19.30",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/pmmp/BedrockProtocol.git",
|
"url": "https://github.com/pmmp/BedrockProtocol.git",
|
||||||
"reference": "d1b3e83f77e2c6628b64793485260cddc55d92e3"
|
"reference": "94de2221676ca717587e1ff4e45445c24ada1749"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/d1b3e83f77e2c6628b64793485260cddc55d92e3",
|
"url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/94de2221676ca717587e1ff4e45445c24ada1749",
|
||||||
"reference": "d1b3e83f77e2c6628b64793485260cddc55d92e3",
|
"reference": "94de2221676ca717587e1ff4e45445c24ada1749",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -312,9 +312,9 @@
|
|||||||
"description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP",
|
"description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP",
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/pmmp/BedrockProtocol/issues",
|
"issues": "https://github.com/pmmp/BedrockProtocol/issues",
|
||||||
"source": "https://github.com/pmmp/BedrockProtocol/tree/12.2.0+bedrock-1.19.21"
|
"source": "https://github.com/pmmp/BedrockProtocol/tree/bedrock-1.19.30"
|
||||||
},
|
},
|
||||||
"time": "2022-08-24T18:47:37+00:00"
|
"time": "2022-09-20T18:35:00+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "pocketmine/binaryutils",
|
"name": "pocketmine/binaryutils",
|
||||||
@ -926,16 +926,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "ramsey/uuid",
|
"name": "ramsey/uuid",
|
||||||
"version": "4.5.0",
|
"version": "4.5.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/ramsey/uuid.git",
|
"url": "https://github.com/ramsey/uuid.git",
|
||||||
"reference": "ef842484ba57f163c6d465ab744bfecb872a11d4"
|
"reference": "a161a26d917604dc6d3aa25100fddf2556e9f35d"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/ramsey/uuid/zipball/ef842484ba57f163c6d465ab744bfecb872a11d4",
|
"url": "https://api.github.com/repos/ramsey/uuid/zipball/a161a26d917604dc6d3aa25100fddf2556e9f35d",
|
||||||
"reference": "ef842484ba57f163c6d465ab744bfecb872a11d4",
|
"reference": "a161a26d917604dc6d3aa25100fddf2556e9f35d",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -1004,7 +1004,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/ramsey/uuid/issues",
|
"issues": "https://github.com/ramsey/uuid/issues",
|
||||||
"source": "https://github.com/ramsey/uuid/tree/4.5.0"
|
"source": "https://github.com/ramsey/uuid/tree/4.5.1"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@ -1016,7 +1016,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2022-09-15T01:44:53+00:00"
|
"time": "2022-09-16T03:22:46+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-php81",
|
"name": "symfony/polyfill-php81",
|
||||||
|
@ -177,10 +177,10 @@ namespace pocketmine {
|
|||||||
|
|
||||||
|
|
||||||
--------------------------------------- ! WARNING ! ---------------------------------------
|
--------------------------------------- ! WARNING ! ---------------------------------------
|
||||||
You're using PHP 8.0 with JIT enabled. This provides significant performance improvements.
|
You're using PHP with JIT enabled. This provides significant performance improvements.
|
||||||
HOWEVER, it is EXPERIMENTAL, and has already been seen to cause weird and unexpected bugs.
|
HOWEVER, it is EXPERIMENTAL, and has already been seen to cause weird and unexpected bugs.
|
||||||
Proceed with caution.
|
Proceed with caution.
|
||||||
If you want to report any bugs, make sure to mention that you are using PHP 8.0 with JIT.
|
If you want to report any bugs, make sure to mention that you have enabled PHP JIT.
|
||||||
To turn off JIT, change `opcache.jit` to `0` in your php.ini file.
|
To turn off JIT, change `opcache.jit` to `0` in your php.ini file.
|
||||||
-------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ use function str_repeat;
|
|||||||
|
|
||||||
final class VersionInfo{
|
final class VersionInfo{
|
||||||
public const NAME = "PocketMine-MP";
|
public const NAME = "PocketMine-MP";
|
||||||
public const BASE_VERSION = "4.8.2";
|
public const BASE_VERSION = "4.9.1";
|
||||||
public const IS_DEVELOPMENT_BUILD = true;
|
public const IS_DEVELOPMENT_BUILD = true;
|
||||||
public const BUILD_CHANNEL = "beta";
|
public const BUILD_CHANNEL = "beta";
|
||||||
|
|
||||||
|
@ -227,7 +227,7 @@ final class EntityFactory{
|
|||||||
*/
|
*/
|
||||||
public function createFromData(World $world, CompoundTag $nbt) : ?Entity{
|
public function createFromData(World $world, CompoundTag $nbt) : ?Entity{
|
||||||
try{
|
try{
|
||||||
$saveId = $nbt->getTag("id") ?? $nbt->getTag("identifier");
|
$saveId = $nbt->getTag("identifier") ?? $nbt->getTag("id");
|
||||||
$func = null;
|
$func = null;
|
||||||
if($saveId instanceof StringTag){
|
if($saveId instanceof StringTag){
|
||||||
$func = $this->creationFuncs[$saveId->getValue()] ?? null;
|
$func = $this->creationFuncs[$saveId->getValue()] ?? null;
|
||||||
@ -248,7 +248,7 @@ final class EntityFactory{
|
|||||||
|
|
||||||
public function injectSaveId(string $class, CompoundTag $saveData) : void{
|
public function injectSaveId(string $class, CompoundTag $saveData) : void{
|
||||||
if(isset($this->saveNames[$class])){
|
if(isset($this->saveNames[$class])){
|
||||||
$saveData->setTag("id", new StringTag($this->saveNames[$class]));
|
$saveData->setTag("identifier", new StringTag($this->saveNames[$class]));
|
||||||
}else{
|
}else{
|
||||||
throw new \InvalidArgumentException("Entity $class is not registered");
|
throw new \InvalidArgumentException("Entity $class is not registered");
|
||||||
}
|
}
|
||||||
|
@ -186,6 +186,10 @@ class ItemEntity extends Entity{
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function canSaveWithChunk() : bool{
|
||||||
|
return !$this->item->isNull() && parent::canSaveWithChunk();
|
||||||
|
}
|
||||||
|
|
||||||
public function saveNBT() : CompoundTag{
|
public function saveNBT() : CompoundTag{
|
||||||
$nbt = parent::saveNBT();
|
$nbt = parent::saveNBT();
|
||||||
$nbt->setTag("Item", $this->item->nbtSerialize());
|
$nbt->setTag("Item", $this->item->nbtSerialize());
|
||||||
|
@ -56,6 +56,7 @@ use pocketmine\network\mcpe\handler\LoginPacketHandler;
|
|||||||
use pocketmine\network\mcpe\handler\PacketHandler;
|
use pocketmine\network\mcpe\handler\PacketHandler;
|
||||||
use pocketmine\network\mcpe\handler\PreSpawnPacketHandler;
|
use pocketmine\network\mcpe\handler\PreSpawnPacketHandler;
|
||||||
use pocketmine\network\mcpe\handler\ResourcePacksPacketHandler;
|
use pocketmine\network\mcpe\handler\ResourcePacksPacketHandler;
|
||||||
|
use pocketmine\network\mcpe\handler\SessionStartPacketHandler;
|
||||||
use pocketmine\network\mcpe\handler\SpawnResponsePacketHandler;
|
use pocketmine\network\mcpe\handler\SpawnResponsePacketHandler;
|
||||||
use pocketmine\network\mcpe\protocol\AvailableCommandsPacket;
|
use pocketmine\network\mcpe\protocol\AvailableCommandsPacket;
|
||||||
use pocketmine\network\mcpe\protocol\ChunkRadiusUpdatedPacket;
|
use pocketmine\network\mcpe\protocol\ChunkRadiusUpdatedPacket;
|
||||||
@ -164,6 +165,7 @@ class NetworkSession{
|
|||||||
*/
|
*/
|
||||||
private \SplQueue $compressedQueue;
|
private \SplQueue $compressedQueue;
|
||||||
private bool $forceAsyncCompression = true;
|
private bool $forceAsyncCompression = true;
|
||||||
|
private bool $enableCompression = false; //disabled until handshake completed
|
||||||
|
|
||||||
private PacketSerializerContext $packetSerializerContext;
|
private PacketSerializerContext $packetSerializerContext;
|
||||||
|
|
||||||
@ -196,17 +198,10 @@ class NetworkSession{
|
|||||||
|
|
||||||
$this->connectTime = time();
|
$this->connectTime = time();
|
||||||
|
|
||||||
$this->setHandler(new LoginPacketHandler(
|
$this->setHandler(new SessionStartPacketHandler(
|
||||||
$this->server,
|
$this->server,
|
||||||
$this,
|
$this,
|
||||||
function(PlayerInfo $info) : void{
|
fn() => $this->onSessionStartSuccess()
|
||||||
$this->info = $info;
|
|
||||||
$this->logger->info("Player: " . TextFormat::AQUA . $info->getUsername() . TextFormat::RESET);
|
|
||||||
$this->logger->setPrefix($this->getLogPrefix());
|
|
||||||
},
|
|
||||||
function(bool $isAuthenticated, bool $authRequired, ?string $error, ?string $clientPubKey) : void{
|
|
||||||
$this->setAuthenticationStatus($isAuthenticated, $authRequired, $error, $clientPubKey);
|
|
||||||
}
|
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->manager->add($this);
|
$this->manager->add($this);
|
||||||
@ -221,6 +216,24 @@ class NetworkSession{
|
|||||||
return $this->logger;
|
return $this->logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function onSessionStartSuccess() : void{
|
||||||
|
$this->logger->debug("Session start handshake completed, awaiting login packet");
|
||||||
|
$this->flushSendBuffer(true);
|
||||||
|
$this->enableCompression = true;
|
||||||
|
$this->setHandler(new LoginPacketHandler(
|
||||||
|
$this->server,
|
||||||
|
$this,
|
||||||
|
function(PlayerInfo $info) : void{
|
||||||
|
$this->info = $info;
|
||||||
|
$this->logger->info("Player: " . TextFormat::AQUA . $info->getUsername() . TextFormat::RESET);
|
||||||
|
$this->logger->setPrefix($this->getLogPrefix());
|
||||||
|
},
|
||||||
|
function(bool $isAuthenticated, bool $authRequired, ?string $error, ?string $clientPubKey) : void{
|
||||||
|
$this->setAuthenticationStatus($isAuthenticated, $authRequired, $error, $clientPubKey);
|
||||||
|
}
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
protected function createPlayer() : void{
|
protected function createPlayer() : void{
|
||||||
$this->server->createPlayer($this, $this->info, $this->authenticated, $this->cachedOfflinePlayerData)->onCompletion(
|
$this->server->createPlayer($this, $this->info, $this->authenticated, $this->cachedOfflinePlayerData)->onCompletion(
|
||||||
\Closure::fromCallable([$this, 'onPlayerCreated']),
|
\Closure::fromCallable([$this, 'onPlayerCreated']),
|
||||||
@ -335,18 +348,22 @@ class NetworkSession{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($this->enableCompression){
|
||||||
Timings::$playerNetworkReceiveDecompress->startTiming();
|
Timings::$playerNetworkReceiveDecompress->startTiming();
|
||||||
try{
|
try{
|
||||||
$stream = new PacketBatch($this->compressor->decompress($payload));
|
$decompressed = $this->compressor->decompress($payload);
|
||||||
}catch(DecompressionException $e){
|
}catch(DecompressionException $e){
|
||||||
$this->logger->debug("Failed to decompress packet: " . base64_encode($payload));
|
$this->logger->debug("Failed to decompress packet: " . base64_encode($payload));
|
||||||
throw PacketHandlingException::wrap($e, "Compressed packet batch decode error");
|
throw PacketHandlingException::wrap($e, "Compressed packet batch decode error");
|
||||||
}finally{
|
}finally{
|
||||||
Timings::$playerNetworkReceiveDecompress->stopTiming();
|
Timings::$playerNetworkReceiveDecompress->stopTiming();
|
||||||
}
|
}
|
||||||
|
}else{
|
||||||
|
$decompressed = $payload;
|
||||||
|
}
|
||||||
|
|
||||||
try{
|
try{
|
||||||
foreach($stream->getPackets($this->packetPool, $this->packetSerializerContext, 500) as [$packet, $buffer]){
|
foreach((new PacketBatch($decompressed))->getPackets($this->packetPool, $this->packetSerializerContext, 500) as [$packet, $buffer]){
|
||||||
if($packet === null){
|
if($packet === null){
|
||||||
$this->logger->debug("Unknown packet: " . base64_encode($buffer));
|
$this->logger->debug("Unknown packet: " . base64_encode($buffer));
|
||||||
throw new PacketHandlingException("Unknown packet received");
|
throw new PacketHandlingException("Unknown packet received");
|
||||||
@ -451,7 +468,14 @@ class NetworkSession{
|
|||||||
}elseif($this->forceAsyncCompression){
|
}elseif($this->forceAsyncCompression){
|
||||||
$syncMode = false;
|
$syncMode = false;
|
||||||
}
|
}
|
||||||
$promise = $this->server->prepareBatch(PacketBatch::fromPackets($this->packetSerializerContext, ...$this->sendBuffer), $this->compressor, $syncMode);
|
|
||||||
|
$batch = PacketBatch::fromPackets($this->packetSerializerContext, ...$this->sendBuffer);
|
||||||
|
if($this->enableCompression){
|
||||||
|
$promise = $this->server->prepareBatch($batch, $this->compressor, $syncMode);
|
||||||
|
}else{
|
||||||
|
$promise = new CompressBatchPromise();
|
||||||
|
$promise->resolve($batch->getBuffer());
|
||||||
|
}
|
||||||
$this->sendBuffer = [];
|
$this->sendBuffer = [];
|
||||||
$this->queueCompressedNoBufferFlush($promise, $immediate);
|
$this->queueCompressedNoBufferFlush($promise, $immediate);
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,9 @@ use pocketmine\network\mcpe\protocol\types\inventory\ContainerIds;
|
|||||||
use pocketmine\network\mcpe\protocol\types\inventory\ItemStack;
|
use pocketmine\network\mcpe\protocol\types\inventory\ItemStack;
|
||||||
use pocketmine\network\mcpe\protocol\types\inventory\NetworkInventoryAction;
|
use pocketmine\network\mcpe\protocol\types\inventory\NetworkInventoryAction;
|
||||||
use pocketmine\network\mcpe\protocol\types\inventory\UIInventorySlotOffset;
|
use pocketmine\network\mcpe\protocol\types\inventory\UIInventorySlotOffset;
|
||||||
|
use pocketmine\network\mcpe\protocol\types\recipe\IntIdMetaItemDescriptor;
|
||||||
use pocketmine\network\mcpe\protocol\types\recipe\RecipeIngredient;
|
use pocketmine\network\mcpe\protocol\types\recipe\RecipeIngredient;
|
||||||
|
use pocketmine\network\mcpe\protocol\types\recipe\StringIdMetaItemDescriptor;
|
||||||
use pocketmine\player\GameMode;
|
use pocketmine\player\GameMode;
|
||||||
use pocketmine\player\Player;
|
use pocketmine\player\Player;
|
||||||
use pocketmine\utils\AssumptionFailedError;
|
use pocketmine\utils\AssumptionFailedError;
|
||||||
@ -110,7 +112,7 @@ class TypeConverter{
|
|||||||
|
|
||||||
public function coreItemStackToRecipeIngredient(Item $itemStack) : RecipeIngredient{
|
public function coreItemStackToRecipeIngredient(Item $itemStack) : RecipeIngredient{
|
||||||
if($itemStack->isNull()){
|
if($itemStack->isNull()){
|
||||||
return new RecipeIngredient(0, 0, 0);
|
return new RecipeIngredient(null, 0);
|
||||||
}
|
}
|
||||||
if($itemStack->hasAnyDamageValue()){
|
if($itemStack->hasAnyDamageValue()){
|
||||||
[$id, ] = ItemTranslator::getInstance()->toNetworkId($itemStack->getId(), 0);
|
[$id, ] = ItemTranslator::getInstance()->toNetworkId($itemStack->getId(), 0);
|
||||||
@ -118,16 +120,26 @@ class TypeConverter{
|
|||||||
}else{
|
}else{
|
||||||
[$id, $meta] = ItemTranslator::getInstance()->toNetworkId($itemStack->getId(), $itemStack->getMeta());
|
[$id, $meta] = ItemTranslator::getInstance()->toNetworkId($itemStack->getId(), $itemStack->getMeta());
|
||||||
}
|
}
|
||||||
return new RecipeIngredient($id, $meta, $itemStack->getCount());
|
return new RecipeIngredient(new IntIdMetaItemDescriptor($id, $meta), $itemStack->getCount());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function recipeIngredientToCoreItemStack(RecipeIngredient $ingredient) : Item{
|
public function recipeIngredientToCoreItemStack(RecipeIngredient $ingredient) : Item{
|
||||||
if($ingredient->getId() === 0){
|
$descriptor = $ingredient->getDescriptor();
|
||||||
|
if($descriptor === null){
|
||||||
return VanillaItems::AIR();
|
return VanillaItems::AIR();
|
||||||
}
|
}
|
||||||
[$id, $meta] = ItemTranslator::getInstance()->fromNetworkIdWithWildcardHandling($ingredient->getId(), $ingredient->getMeta());
|
if($descriptor instanceof IntIdMetaItemDescriptor){
|
||||||
|
[$id, $meta] = ItemTranslator::getInstance()->fromNetworkIdWithWildcardHandling($descriptor->getId(), $descriptor->getMeta());
|
||||||
return ItemFactory::getInstance()->get($id, $meta, $ingredient->getCount());
|
return ItemFactory::getInstance()->get($id, $meta, $ingredient->getCount());
|
||||||
}
|
}
|
||||||
|
if($descriptor instanceof StringIdMetaItemDescriptor){
|
||||||
|
$intId = GlobalItemTypeDictionary::getInstance()->getDictionary()->fromStringId($descriptor->getId());
|
||||||
|
[$id, $meta] = ItemTranslator::getInstance()->fromNetworkIdWithWildcardHandling($intId, $descriptor->getMeta());
|
||||||
|
return ItemFactory::getInstance()->get($id, $meta, $ingredient->getCount());
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new \LogicException("Unsupported conversion of recipe ingredient to core item stack");
|
||||||
|
}
|
||||||
|
|
||||||
public function coreItemStackToNet(Item $itemStack) : ItemStack{
|
public function coreItemStackToNet(Item $itemStack) : ItemStack{
|
||||||
if($itemStack->isNull()){
|
if($itemStack->isNull()){
|
||||||
|
@ -51,7 +51,6 @@ use pocketmine\network\mcpe\InventoryManager;
|
|||||||
use pocketmine\network\mcpe\NetworkSession;
|
use pocketmine\network\mcpe\NetworkSession;
|
||||||
use pocketmine\network\mcpe\protocol\ActorEventPacket;
|
use pocketmine\network\mcpe\protocol\ActorEventPacket;
|
||||||
use pocketmine\network\mcpe\protocol\ActorPickRequestPacket;
|
use pocketmine\network\mcpe\protocol\ActorPickRequestPacket;
|
||||||
use pocketmine\network\mcpe\protocol\AdventureSettingsPacket;
|
|
||||||
use pocketmine\network\mcpe\protocol\AnimatePacket;
|
use pocketmine\network\mcpe\protocol\AnimatePacket;
|
||||||
use pocketmine\network\mcpe\protocol\BlockActorDataPacket;
|
use pocketmine\network\mcpe\protocol\BlockActorDataPacket;
|
||||||
use pocketmine\network\mcpe\protocol\BlockPickRequestPacket;
|
use pocketmine\network\mcpe\protocol\BlockPickRequestPacket;
|
||||||
@ -664,10 +663,6 @@ class InGamePacketHandler extends PacketHandler{
|
|||||||
return true; //this is a broken useless packet, so we don't use it
|
return true; //this is a broken useless packet, so we don't use it
|
||||||
}
|
}
|
||||||
|
|
||||||
public function handleAdventureSettings(AdventureSettingsPacket $packet) : bool{
|
|
||||||
return true; //no longer used, but the client still sends it for flight changes
|
|
||||||
}
|
|
||||||
|
|
||||||
public function handleBlockActorData(BlockActorDataPacket $packet) : bool{
|
public function handleBlockActorData(BlockActorDataPacket $packet) : bool{
|
||||||
$pos = new Vector3($packet->blockPosition->getX(), $packet->blockPosition->getY(), $packet->blockPosition->getZ());
|
$pos = new Vector3($packet->blockPosition->getX(), $packet->blockPosition->getY(), $packet->blockPosition->getZ());
|
||||||
if($pos->distanceSquared($this->player->getLocation()) > 10000){
|
if($pos->distanceSquared($this->player->getLocation()) > 10000){
|
||||||
|
76
src/network/mcpe/handler/SessionStartPacketHandler.php
Normal file
76
src/network/mcpe/handler/SessionStartPacketHandler.php
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
<?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\handler;
|
||||||
|
|
||||||
|
use pocketmine\lang\KnownTranslationFactory;
|
||||||
|
use pocketmine\network\mcpe\NetworkSession;
|
||||||
|
use pocketmine\network\mcpe\protocol\NetworkSettingsPacket;
|
||||||
|
use pocketmine\network\mcpe\protocol\PlayStatusPacket;
|
||||||
|
use pocketmine\network\mcpe\protocol\ProtocolInfo;
|
||||||
|
use pocketmine\network\mcpe\protocol\RequestNetworkSettingsPacket;
|
||||||
|
use pocketmine\network\mcpe\protocol\types\CompressionAlgorithm;
|
||||||
|
use pocketmine\Server;
|
||||||
|
|
||||||
|
final class SessionStartPacketHandler extends PacketHandler{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @phpstan-param \Closure() : void $onSuccess
|
||||||
|
*/
|
||||||
|
public function __construct(
|
||||||
|
private Server $server,
|
||||||
|
private NetworkSession $session,
|
||||||
|
private \Closure $onSuccess
|
||||||
|
){}
|
||||||
|
|
||||||
|
public function handleRequestNetworkSettings(RequestNetworkSettingsPacket $packet) : bool{
|
||||||
|
$protocolVersion = $packet->getProtocolVersion();
|
||||||
|
if(!$this->isCompatibleProtocol($protocolVersion)){
|
||||||
|
$this->session->sendDataPacket(PlayStatusPacket::create($protocolVersion < ProtocolInfo::CURRENT_PROTOCOL ? PlayStatusPacket::LOGIN_FAILED_CLIENT : PlayStatusPacket::LOGIN_FAILED_SERVER), true);
|
||||||
|
|
||||||
|
//This pocketmine disconnect message will only be seen by the console (PlayStatusPacket causes the messages to be shown for the client)
|
||||||
|
$this->session->disconnect(
|
||||||
|
$this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_disconnect_incompatibleProtocol((string) $protocolVersion)),
|
||||||
|
false
|
||||||
|
);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO: we're filling in the defaults to get pre-1.19.30 behaviour back for now, but we should explore the new options in the future
|
||||||
|
$this->session->sendDataPacket(NetworkSettingsPacket::create(
|
||||||
|
NetworkSettingsPacket::COMPRESS_EVERYTHING,
|
||||||
|
CompressionAlgorithm::ZLIB,
|
||||||
|
false,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
));
|
||||||
|
($this->onSuccess)();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function isCompatibleProtocol(int $protocolVersion) : bool{
|
||||||
|
return $protocolVersion === ProtocolInfo::CURRENT_PROTOCOL;
|
||||||
|
}
|
||||||
|
}
|
@ -58,7 +58,7 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{
|
|||||||
* Sometimes this gets changed when the MCPE-layer protocol gets broken to the point where old and new can't
|
* Sometimes this gets changed when the MCPE-layer protocol gets broken to the point where old and new can't
|
||||||
* communicate. It's important that we check this to avoid catastrophes.
|
* communicate. It's important that we check this to avoid catastrophes.
|
||||||
*/
|
*/
|
||||||
private const MCPE_RAKNET_PROTOCOL_VERSION = 10;
|
private const MCPE_RAKNET_PROTOCOL_VERSION = 11;
|
||||||
|
|
||||||
private const MCPE_RAKNET_PACKET_ID = "\xfe";
|
private const MCPE_RAKNET_PACKET_ID = "\xfe";
|
||||||
|
|
||||||
|
@ -2492,7 +2492,7 @@ class World implements ChunkManager{
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if($entity === null){
|
if($entity === null){
|
||||||
$saveIdTag = $nbt->getTag("id") ?? $nbt->getTag("identifier");
|
$saveIdTag = $nbt->getTag("identifier") ?? $nbt->getTag("id");
|
||||||
$saveId = "<unknown>";
|
$saveId = "<unknown>";
|
||||||
if($saveIdTag instanceof StringTag){
|
if($saveIdTag instanceof StringTag){
|
||||||
$saveId = $saveIdTag->getValue();
|
$saveId = $saveIdTag->getValue();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user