GithubHelp home page GithubHelp logo

pmmp / bedrockprotocol Goto Github PK

View Code? Open in Web Editor NEW
128.0 17.0 81.0 1.46 MB

An implementation of the Minecraft: Bedrock Edition protocol in PHP

License: GNU Lesser General Public License v3.0

PHP 100.00%
phpstan-strict github-actions-enabled on-packagist phpstan-l9 php81 php82

bedrockprotocol's People

Contributors

alvin0319 avatar ambiennt avatar bqleine avatar brandpvp avatar davycraft648 avatar dependabot[bot] avatar dktapps avatar dries-c avatar frago9876543210 avatar hashimthearab avatar inxomnyaa avatar ismaileke avatar ivancraft623 avatar javierleon9966 avatar leolee3914 avatar pooooooon avatar refaltor77 avatar s3v3nice avatar senseitarzan avatar sky-min avatar thedatalioness avatar tobiasgrether avatar yuyaprgrm avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

bedrockprotocol's Issues

Incorrect encoding of data in LevelEventGenericPacket

For some reason, the CompoundTag in LevelEventGenericPacket is encoded differently from every other tag in the protocol. It's written without the header (i.e. CompoundTag->write()). This means that we can't use CachedNbt for it (in its current form, anyway).

CommandParameter type mismatch

CommandParameter::standard("player", AvailableCommandsPacket::ARG_TYPE_TARGET)

when using this code, to overwrite the command overloads on AvailableCommandsPackets
it produces this result /
image

Missing bool field in SpawnParticleEffectPacket

I use deepl translation

overview

In the SpawnParticleEffectPacket, there appears to be a bool field after particleName field.(since 1.18.30)
The source of this information is from 1.18.12, 1.18.30, 1.18.31 bds and PacketViolationWarningPacket.

protected function decodePayload(PacketSerializer $in) : void{
$this->dimensionId = $in->getByte();
$this->actorUniqueId = $in->getActorUniqueId();
$this->position = $in->getVector3();
$this->particleName = $in->getString();
$this->molangVariablesJson = $in->getString();
}

test code

Expected result: The client does not terminate the connection.(and cream and red particles are displayed.)
Actual result: The client terminates the connection.

public function onPlayerJoin(PlayerJoinEvent $event): void{
	$player = $event->getPlayer();
	$packet = SpawnParticleEffectPacket::create(
		0,
		-1,
		new Vector3(0,0,0),
		"minecraft:mobspell_emitter",
		'[{"name":"variable.color","value":{"type":"member_array","value":[{"name":".r","value":{"type":"float","value":1}},{"name":".g","value":{"type":"float","value":0}},{"name":".b","value":{"type":"float","value":0}},{"name":".a","value":{"type":"float","value":1}}]}}]'
	);
	$packet1 = SpawnParticleEffectPacket::create(
		0,
		-1,
		new Vector3(0,0,0),
		"minecraft:mobspell_emitter",
		""//null
	);
	$player->getNetworkSession()->sendDataPacket($packet);
	$player->getNetworkSession()->sendDataPacket($packet1);
}

PacketViolationWarningPacket

"type":"pocketmine\network\mcpe\protocol\PacketViolationWarningPacket":private]=>
int(0)
["severity":"pocketmine\network\mcpe\protocol\PacketViolationWarningPacket":private]=>
int(2) //SEVERITY_TERMINATING_CONNECTION
["packetId":"pocketmine\network\mcpe\protocol\PacketViolationWarningPacket":private]=>
int(118)  //0x76, SPAWN_PARTICLE_EFFECT_PACKET
["message":"pocketmine\network\mcpe\protocol\PacketViolationWarningPacket":private]=>
string(0) ""
["senderSubId"]=>
int(0)
["recipientSubId"]=>
int(0)

credit

This report is written on behalf of yuyaprgrm.
https://github.com/yuyaprgrm

https://github.com/famima65536

molangVariablesJson source
https://wiki.vg/Bedrock_Protocol#Spawn_Particle_Effect

Missing field of StructureTemplateDataResponsePacket

Issue description

StructureTemplateDataResponsePacket has an additional responseType field at the end, but this currently can't be added because we aren't currently decoding the NBT correctly, which is necessary to be able to seek to the correct place in the buffer.

when new cd disc comes out?

previously, i was trying to make a new cd music Pigstep and Otherside but the test failed and i feel like i am not allowed again to make a pr before testing, how about you make a new cd music Pigstep and Otherside for the software?

i feel like when i wanna do it again the test will failed again.

Pull requests: #41

Remove PacketBatch

PacketBatch can be easily replaced with a couple of utility functions.

  • public static PacketBatch::decode(string $batch) : \Generator<int, array{Packet, string}, void, void replaces (new PacketBatch(...))->getPackets(...)
  • public static PacketBatch::fromPackets(array $packets) : string replaces PacketBatch::fromPackets(...)->getBuffer()

In basically all analysed cases, PacketBatch was not actually used in an object context, so it's just causing us to create wasted objects in hot paths, as well as limiting the range of stuff we can do.

ClientboundMapItemDataPacket Crash

Currently there is a crash that was introduced in version 1.19.20 and it is that the $origin variable from ClientboundMapItemDataPacket is being accessed before being initialised on Line 128.
I thought this had been reported previously but I can't find anything official about it and the bug still exists.

(Proper Crash Message)

2022-08-27 [02:24:03.810] [Server thread/CRITICAL]: Error: "Typed property pocketmine\network\mcpe\protocol\ClientboundMapItemDataPacket::$origin must not be accessed before initialization" (EXCEPTION) in "pmsrc/vendor/pocketmine/bedrock-protocol/src/ClientboundMapItemDataPacket" at line 128

Require usage of ::create() for packets

::create() was introduced to solve the issue of forgetting to initialize packet fields, which led to many confusing issues for plugin devs.

In furtherance of this goal, we need to prevent the use of new WhateverPacket entirely, and require the usage of WhateverPacket::create() exclusively. This would likely be achieved by making DataPacket::__construct() private, and introducing a DataPacket::fromBuffer() : static static method.

PacketSerializer error when using MobEquipmentPacket

[21:12:21.288] [Server thread/CRITICAL]: Error: "Call to undefined method pocketmine\network\mcpe\protocol\MobEquipmentPacket::getTypeId()" (EXCEPTION) in "pmsrc/vendor/pocketmine/bedrock-protocol/src/serializer/PacketSerializer" at line 453

Thats exact error

im not sure if its a problem with my code but its only giving out that.

Make MoveActorDeltaPacket less obnoxious to use

It's possible to make each of the fields nullable, and build the flags dynamically based on the given inputs, rather than requiring the caller to set them. This would require much less code at call sites, and be much less error-prone.

Missing protocol changes in PlayerAuthInputPacket

There are additional protocol changes in PlayerAuthInputPacket in 1.16.210 which I'm aware of, but didn't take the time to implement because they weren't needed. However, they should be implemented at leisure for completeness' sake.

Missing fields of StructureSettings

Since some unknown version in the past, StructureSettings now has additional fields after the mirror field:

  • animationMode (byte)
  • animationSeconds (float)

Remove EntityMetadataCollection

This is an implementation-specific class. Having it in BedrockProtocol was a mistake, since it needs to be updated any time the internal implementation details of PM require it. In addition, the "dirty properties" tracking can be done other ways; this library should not be making decisions on how this is done.

Performance impact of using closures to handle item decoding

Profiling the encoding of CraftingDataPacket showed that significant performance losses are made due to the use of multiple closures for every ItemStack encoded.

Two closures are used:

  • To read/write the ItemStackNetId in the middle of the structure (used for all cases except creative and crafting data) - thanks for the awkward design Mojang
  • To scope-isolate the encoding/decoding of ItemStack extradata

Local experimentation showed ~20% performance improvements from replacing these closures with regular functions.
I'm not super clear why closures have such a large performance impact in this case, but we might want to investigate other usages too (e.g. optionals, first-class callables).

PacketSerializer Crash

`PocketMine-MP Crash Dump Thu Dec 2 15:08:46 -05 2021

Error: Call to a member function getTypeId() on array
File: pmsrc/vendor/pocketmine/bedrock-protocol/src/serializer/PacketSerializer
Line: 459
Type: Error

Code:
[450] *
[451] * @param MetadataProperty[] $metadata
[452] *
[453] * @phpstan-param array<int, MetadataProperty> $metadata
[454] /
[455] public function putEntityMetadata(array $metadata) : void{
[456] $this->putUnsignedVarInt(count($metadata));
[457] foreach($metadata as $key => $d){
[458] $this->putUnsignedVarInt($key);
[459] $this->putUnsignedVarInt($d->getTypeId());
[460] $d->write($this);
[461] }
[462] }
[463]
[464] /
*
[465] * Reads a list of Attributes from the stream.
[466] * @return Attribute[]
[467] *
[468] * @throws BinaryDataException
[469] */

Backtrace:
#0 pmsrc/vendor/pocketmine/bedrock-protocol/src/SetActorDataPacket(61): pocketmine\network\mcpe\protocol\serializer\PacketSerializer->putEntityMetadata(array[1])
#1 pmsrc/vendor/pocketmine/bedrock-protocol/src/DataPacket(93): pocketmine\network\mcpe\protocol\SetActorDataPacket->encodePayload(object pocketmine\network\mcpe\protocol\serializer\PacketSerializer#130724)
#2 pmsrc/vendor/pocketmine/bedrock-protocol/src/serializer/PacketBatch(71): pocketmine\network\mcpe\protocol\DataPacket->encode(object pocketmine\network\mcpe\protocol\serializer\PacketSerializer#130724)
#3 pmsrc/src/network/mcpe/NetworkSession(450): pocketmine\network\mcpe\protocol\serializer\PacketBatch::fromPackets(object pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext#27140, object pocketmine\network\mcpe\protocol\AddPlayerPacket#130601, object pocketmine\network\mcpe\protocol\SetActorDataPacket#130603, object pocketmine\network\mcpe\protocol\MobArmorEquipmentPacket#130669, object pocketmine\network\mcpe\protocol\MobEquipmentPacket#130712, object pocketmine\network\mcpe\protocol\MoveActorAbsolutePacket#130458, object pocketmine\network\mcpe\protocol\TextPacket#130718, object pocketmine\network\mcpe\protocol\SetDisplayObjectivePacket#130618, object pocketmine\network\mcpe\protocol\RemoveObjectivePacket#130624, object pocketmine\network\mcpe\protocol\SetDisplayObjectivePacket#130558, object pocketmine\network\mcpe\protocol\RemoveObjectivePacket#130626, object pocketmine\network\mcpe\protocol\SetDisplayObjectivePacket#130475, object pocketmine\network\mcpe\protocol\RemoveObjectivePacket#130619, object pocketmine\network\mcpe\protocol\SetDisplayObjectivePacket#130621, object pocketmine\network\mcpe\protocol\SetScorePacket#130579, object pocketmine\network\mcpe\protocol\SetScorePacket#130533, object pocketmine\network\mcpe\protocol\SetScorePacket#115519, object pocketmine\network\mcpe\protocol\MobEffectPacket#130755, object pocketmine\network\mcpe\protocol\MobEffectPacket#130756, object pocketmine\network\mcpe\protocol\MobEffectPacket#130757, object pocketmine\network\mcpe\protocol\MobEffectPacket#130758, object pocketmine\network\mcpe\protocol\SetActorDataPacket#130564, object pocketmine\network\mcpe\protocol\UpdateAttributesPacket#130723)
#4 pmsrc/src/network/mcpe/NetworkSession(1073): pocketmine\network\mcpe\NetworkSession->flushSendBuffer()
#5 pmsrc/src/network/NetworkSessionManager(67): pocketmine\network\mcpe\NetworkSession->tick()
#6 pmsrc/src/network/Network(91): pocketmine\network\NetworkSessionManager->tick()
#7 pmsrc/src/Server(1763): pocketmine\network\Network->tick()
#8 pmsrc/src/Server(1642): pocketmine\Server->tick()
#9 pmsrc/src/Server(1034): pocketmine\Server->tickProcessor()
#10 pmsrc/src/PocketMine(301): pocketmine\Server->__construct(object BaseClassLoader#3, object pocketmine\utils\MainLogger#2, string[10] /home/mad/, string[18] /home/mad/plugins/)
#11 pmsrc/src/PocketMine(324): pocketmine\server()
#12 pmsrc(11): require(string[54] phar:///home/mad/PocketMine-MP.phar/src/PocketMine.php)

PocketMine-MP version: 4.0.0 [Protocol 475]
Git commit: 468faa464b2bc5c97f23fafbb71ea61035f6f218
uname -a: Linux 5.4.0-90-generic #101-Ubuntu SMP Fri Oct 15 20:00:55 UTC 2021 x86_64
PHP Version: 8.0.12
Zend version: 4.0.12
OS: Linux, linux
Composer libraries:

  • adhocore/json-comment 1.1.2@fc2f76979f0a44a5f5bc2a2b600d0762fe0e78e7
  • brick/math 0.9.3@ca57d18f028f84f777b2168cd1911b0dee2343ae
  • daverandom/callback-validator unknown@unknown
  • fgrosse/phpasn1 v2.3.0@20299033c35f4300eb656e7e8e88cf52d1d6694e
  • netresearch/jsonmapper v4.0.0@8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d
  • pocketmine/bedrock-data 1.5.0+bedrock-1.18.0@482c679aa5ed0b81c088c2b1ff0b8110a94c8a6c
  • pocketmine/bedrock-protocol 7.0.0+bedrock-1.18.0@040a883
  • pocketmine/binaryutils 0.2.2@f883e1cf9099ed6a757a10a2f75b3333eeb2cdf9
  • pocketmine/callback-validator 1.0.3@64787469766bcaa7e5885242e85c23c25e8c55a2
  • pocketmine/classloader 0.2.0@49ea303993efdfb39cd302e2156d50aa78209e78
  • pocketmine/color 0.2.0@09be6ea6d76f2e33d6813c39d29c22c46c17e1d2
  • pocketmine/errorhandler 0.3.0@ec742b209e8056bbe855069c4eff94c9734ea19b
  • pocketmine/locale-data 2.0.20@a6e4eb22587e0014f6d658732cf633262723f8d3
  • pocketmine/log 0.4.0@e6c912c0f9055c81d23108ec2d179b96f404c043
  • pocketmine/log-pthreads 0.4.0@61f709e8cf36bcc24e4efe02acded680a1ce23cd
  • pocketmine/math 0.4.0@6d64e2555bd2e95ed024574f75d1cefc135c89fc
  • pocketmine/nbt 0.3.0@98c4a04b55a915e18f83d3b0c9beb24a71abcd31
  • pocketmine/pocketmine-mp 4.0.0@468faa464b2bc5c97f23fafbb71ea61035f6f218
  • pocketmine/raklib 0.14.2@e3a861187470e1facc6625040128f447ebbcbaec
  • pocketmine/raklib-ipc 0.1.1@922a6444b0c6c7daaa5aa5a832107e1ec4738aed
  • pocketmine/snooze 0.3.1@0ac8fc2a781c419a1f64ebca4d5835028f59e29b
  • ramsey/collection 1.2.2@cccc74ee5e328031b15640b51056ee8d3bb66c0a
  • ramsey/uuid 4.2.3@fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df
  • rhumsaa/uuid unknown@unknown
  • symfony/polyfill-ctype v1.23.0@46cd95797e9df938fdd2b03693b5fca5e64b01ce
  • symfony/polyfill-php80 v1.23.1@1100343ed1a92e3a38f9ae122fc0eb21602547be
  • symfony/polyfill-php81 v1.23.0@e66119f3de95efc359483f810c4c3e6436279436
  • webmozart/assert 1.10.0@6964c76c7804814a842473e0c8fd15bab0f18e25
  • webmozart/path-util 2.3.0@d939f7edc24c9a1bb9c0dee5cb05d8e859490725

Loaded plugins:
BedcoreProtect 1.0.0 by matcracker for API(s) 4.0.0-BETA12
BuilderTools 1.3.0-beta1 by CzechPMDevs, VixikHD for API(s) 4.0.0-beta1
DEVirion 1.2.5-ALPHA12 by poggit, SOFe for API(s) 4.0.0
DeathInventoryLog 0.0.1 by for API(s) 4.0.0
DevTools 1.15.0+dev by PocketMine Team for API(s) 4.0.0
FormImagesFix 0.0.1 by for API(s) 4.0.0
HCF 2 by ImAMadDev for API(s) 4.0.0
Worlds 3.0.10 by survanetwork for API(s) 4.0.0

----------------------REPORT THE DATA BELOW THIS LINE-----------------------

===BEGIN CRASH DUMP===
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
===END CRASH DUMP===
`

Permit lazy decoding of item NBT

NBT is relatively expensive to decode, and in most places where it's sent, we don't actually need to read it.

This includes places like MobEquipmentPacket and others.

In theory it should be possible to cache the raw ItemStack extradata bytes and decode them on request only, since the extradata bytes are length-prefixed.

Start using native enums

This will permit hardening validation of packets in many areas where it's currently impractical to do so, as well as improving type safety.

Overengineered PacketBatch::getPackets()

  • It returns a Generator, so the $max parameter is redundant (limiting can be implemented in calling code).
  • It doesn't actually decode the packets at all, so a PacketSerializerContext is not even necessary, but still required
  • why are we returning an un-decoded packet? We can simply return the buffer to the calling code and let it decide how to deal with it ...

Incorrect decoding of PlayerAuthInputPacket

Step to reproduce

Enable SERVER_AUTHORITATIVE_V2_REWIND in StartGamePacket and try to break block

Simple plugin what I used:

<?php

/**
 * @name PlayerAuthInputTest
 * @author alvin0319
 * @main alvin0319\PlayerAuthInputTest\PlayerAuthInputTest
 * @version 1.0.0
 * @api 4.0.0
 */

declare(strict_types=1);

namespace alvin0319\PlayerAuthInputTest;

use pocketmine\event\EventPriority;
use pocketmine\event\server\DataPacketReceiveEvent;
use pocketmine\event\server\DataPacketSendEvent;
use pocketmine\network\mcpe\protocol\MovePlayerPacket;
use pocketmine\network\mcpe\protocol\PlayerAuthInputPacket;
use pocketmine\network\mcpe\protocol\StartGamePacket;
use pocketmine\network\mcpe\protocol\types\PlayerMovementSettings;
use pocketmine\network\mcpe\protocol\types\PlayerMovementType;
use pocketmine\plugin\PluginBase;

final class PlayerAuthInputTest extends PluginBase{

	protected function onEnable() : void{
		$this->getServer()->getPluginManager()->registerEvent(DataPacketSendEvent::class, function(DataPacketSendEvent $event) : void{
			foreach($event->getPackets() as $packet){
				if($packet instanceof StartGamePacket){
					$packet->playerMovementSettings = new PlayerMovementSettings(PlayerMovementType::SERVER_AUTHORITATIVE_V2_REWIND, 20, false);
				}
			}
		}, EventPriority::NORMAL, $this);

		$this->getServer()->getPluginManager()->registerEvent(DataPacketReceiveEvent::class, function(DataPacketReceiveEvent $event) : void{
			$packet = $event->getPacket();
			$player = $event->getOrigin()->getPlayer();
			if($player === null){
				return;
			}
			if($packet instanceof PlayerAuthInputPacket){
				$event->cancel(); // shut up console please

				$pk = MovePlayerPacket::simple(
					$player->getId(),
					$packet->getPosition(),
					$packet->getPitch(),
					$packet->getYaw(),
					$packet->getHeadYaw(),
					MovePlayerPacket::MODE_NORMAL,
					$player->isOnGround(),
					0,
					$packet->getTick()
				);
				if(!$event->getOrigin()->getHandler()?->handleMovePlayer($pk)){
					$this->getLogger()->debug("Unhandled MovePlayerPacket");
				}
			}
		}, EventPriority::NORMAL, $this);
	}
}

Backtrace

[15:11:45.180] [Server thread/DEBUG]: [NetworkSession: alvin0319] PlayerAuthInputPacket: kAFsagJCAJ35wREFgEP8s4VCjpJ/QwAAAAAAAAAAMGakQ4CAgICAAQECe+O/PLy21cC+6bCZvAQAgASEAYIEBCSABIQBggQE
[15:11:45.180] [Server thread/ERROR]: [NetworkSession: alvin0319] Bad packet (error ID 6498211509ff): Error processing PlayerAuthInputPacket: PlayerAuthInputPacket: No bytes left in buffer
[15:11:45.180] [Server thread/DEBUG]: [NetworkSession: alvin0319] pocketmine\network\PacketHandlingException: "Error processing PlayerAuthInputPacket: PlayerAuthInputPacket: No bytes left in buffer" (EXCEPTION) in "pmsrc/src/network
/PacketHandlingException" at line 33
--- Stack trace ---
  #0 pmsrc/src/network/mcpe/NetworkSession(361): pocketmine\network\PacketHandlingException::wrap(object pocketmine\network\PacketHandlingException#103083, string[38] Error processing PlayerAuthInputPacket)
  #1 pmsrc/src/network/mcpe/raklib/RakLibInterface(192): pocketmine\network\mcpe\NetworkSession->handleEncoded(string[95] c.abd.b.jF...g..V'....]~....P9.........0..AA...?.[..&...C.A.....`dd.~..f.......0)
  #2 pmsrc/vendor/pocketmine/raklib-ipc/src/RakLibToUserThreadMessageReceiver(42): pocketmine\network\mcpe\raklib\RakLibInterface->onPacketReceive(integer 0, string[104] .$.....Y[)P.../....Q1...-.......=.i%.N.xt.....mK*...2.n..&..y}
....._7...q.......)
  #3 pmsrc/src/network/mcpe/raklib/RakLibInterface(122): raklib\server\ipc\RakLibToUserThreadMessageReceiver->handle(object pocketmine\network\mcpe\raklib\RakLibInterface#24938)
  #4 pmsrc/vendor/pocketmine/snooze/src/SleeperHandler(123): pocketmine\network\mcpe\raklib\RakLibInterface->pocketmine\network\mcpe\raklib\{closure}()
  #5 pmsrc/vendor/pocketmine/snooze/src/SleeperHandler(82): pocketmine\snooze\SleeperHandler->processNotifications()
  #6 pmsrc/src/Server(1615): pocketmine\snooze\SleeperHandler->sleepUntil(double 1636787505.2061)
  #7 pmsrc/src/Server(1028): pocketmine\Server->tickProcessor()
  #8 pmsrc/src/PocketMine(301): pocketmine\Server->__construct(object BaseClassLoader#2, object pocketmine\utils\MainLogger#3, string[47] D:\MCBE\PocketMine-MP-Projects\alvin-workspace\, string[55] D:\MCBE\PocketMine-MP-Projects\alv
in-workspace\plugins\)
  #9 pmsrc/src/PocketMine(324): pocketmine\server()
  #10 pmsrc(11): require(string[91] phar://D:/MCBE/PocketMine-MP-Projects/alvin-workspace/PocketMine-MP.phar/src/Poc)
--- Previous ---
pocketmine\network\PacketHandlingException: "PlayerAuthInputPacket: No bytes left in buffer" (EXCEPTION) in "pmsrc/src/network/PacketHandlingException" at line 33
  #0 pmsrc/src/network/mcpe/NetworkSession(386): pocketmine\network\PacketHandlingException::wrap(object pocketmine\network\mcpe\protocol\PacketDecodeException#103081)
  #1 pmsrc/src/network/mcpe/NetworkSession(358): pocketmine\network\mcpe\NetworkSession->handleDataPacket(object pocketmine\network\mcpe\protocol\PlayerAuthInputPacket#103087, string[72] ..lj.B.......C...B...C........0f.C........{..
<..................$.......)
  #2 pmsrc/src/network/mcpe/raklib/RakLibInterface(192): pocketmine\network\mcpe\NetworkSession->handleEncoded(string[95] c.abd.b.jF...g..V'....]~....P9.........0..AA...?.[..&...C.A.....`dd.~..f.......0)
  #3 pmsrc/vendor/pocketmine/raklib-ipc/src/RakLibToUserThreadMessageReceiver(42): pocketmine\network\mcpe\raklib\RakLibInterface->onPacketReceive(integer 0, string[104] .$.....Y[)P.../....Q1...-.......=.i%.N.xt.....mK*...2.n..&..y}
....._7...q.......)
  #4 pmsrc/src/network/mcpe/raklib/RakLibInterface(122): raklib\server\ipc\RakLibToUserThreadMessageReceiver->handle(object pocketmine\network\mcpe\raklib\RakLibInterface#24938)
  #5 pmsrc/vendor/pocketmine/snooze/src/SleeperHandler(123): pocketmine\network\mcpe\raklib\RakLibInterface->pocketmine\network\mcpe\raklib\{closure}()
  #6 pmsrc/vendor/pocketmine/snooze/src/SleeperHandler(82): pocketmine\snooze\SleeperHandler->processNotifications()
  #7 pmsrc/src/Server(1615): pocketmine\snooze\SleeperHandler->sleepUntil(double 1636787505.2061)
  #8 pmsrc/src/Server(1028): pocketmine\Server->tickProcessor()
  #9 pmsrc/src/PocketMine(301): pocketmine\Server->__construct(object BaseClassLoader#2, object pocketmine\utils\MainLogger#3, string[47] D:\MCBE\PocketMine-MP-Projects\alvin-workspace\, string[55] D:\MCBE\PocketMine-MP-Projects\alv
in-workspace\plugins\)
  #10 pmsrc/src/PocketMine(324): pocketmine\server()
  #11 pmsrc(11): require(string[91] phar://D:/MCBE/PocketMine-MP-Projects/alvin-workspace/PocketMine-MP.phar/src/Poc)
--- Previous ---
pocketmine\network\mcpe\protocol\PacketDecodeException: "PlayerAuthInputPacket: No bytes left in buffer" (EXCEPTION) in "pmsrc/vendor/pocketmine/bedrock-protocol/src/PacketDecodeException" at line 29
  #0 pmsrc/vendor/pocketmine/bedrock-protocol/src/DataPacket(65): pocketmine\network\mcpe\protocol\PacketDecodeException::wrap(object pocketmine\utils\BinaryDataException#103082, string[21] PlayerAuthInputPacket)
  #1 pmsrc/src/network/mcpe/NetworkSession(384): pocketmine\network\mcpe\protocol\DataPacket->decode(object pocketmine\network\mcpe\protocol\serializer\PacketSerializer#103084)
  #2 pmsrc/src/network/mcpe/NetworkSession(358): pocketmine\network\mcpe\NetworkSession->handleDataPacket(object pocketmine\network\mcpe\protocol\PlayerAuthInputPacket#103087, string[72] ..lj.B.......C...B...C........0f.C........{..
<..................$.......)
  #3 pmsrc/src/network/mcpe/raklib/RakLibInterface(192): pocketmine\network\mcpe\NetworkSession->handleEncoded(string[95] c.abd.b.jF...g..V'....]~....P9.........0..AA...?.[..&...C.A.....`dd.~..f.......0)
  #4 pmsrc/vendor/pocketmine/raklib-ipc/src/RakLibToUserThreadMessageReceiver(42): pocketmine\network\mcpe\raklib\RakLibInterface->onPacketReceive(integer 0, string[104] .$.....Y[)P.../....Q1...-.......=.i%.N.xt.....mK*...2.n..&..y}
....._7...q.......)
  #5 pmsrc/src/network/mcpe/raklib/RakLibInterface(122): raklib\server\ipc\RakLibToUserThreadMessageReceiver->handle(object pocketmine\network\mcpe\raklib\RakLibInterface#24938)
  #6 pmsrc/vendor/pocketmine/snooze/src/SleeperHandler(123): pocketmine\network\mcpe\raklib\RakLibInterface->pocketmine\network\mcpe\raklib\{closure}()
  #7 pmsrc/vendor/pocketmine/snooze/src/SleeperHandler(82): pocketmine\snooze\SleeperHandler->processNotifications()
  #8 pmsrc/src/Server(1615): pocketmine\snooze\SleeperHandler->sleepUntil(double 1636787505.2061)
  #9 pmsrc/src/Server(1028): pocketmine\Server->tickProcessor()
  #10 pmsrc/src/PocketMine(301): pocketmine\Server->__construct(object BaseClassLoader#2, object pocketmine\utils\MainLogger#3, string[47] D:\MCBE\PocketMine-MP-Projects\alvin-workspace\, string[55] D:\MCBE\PocketMine-MP-Projects\al
vin-workspace\plugins\)
  #11 pmsrc/src/PocketMine(324): pocketmine\server()
  #12 pmsrc(11): require(string[91] phar://D:/MCBE/PocketMine-MP-Projects/alvin-workspace/PocketMine-MP.phar/src/Poc)
--- Previous ---
pocketmine\utils\BinaryDataException: "No bytes left in buffer" (EXCEPTION) in "pmsrc/vendor/pocketmine/binaryutils/src/Binary" at line 350
  #0 pmsrc/vendor/pocketmine/binaryutils/src/Binary(334): pocketmine\utils\Binary::readUnsignedVarInt(string[72] ..lj.B.......C...B...C........0f.C........{..<..................$......., integer 72)
  #1 pmsrc/vendor/pocketmine/binaryutils/src/BinaryStream(307): pocketmine\utils\Binary::readVarInt(string[72] ..lj.B.......C...B...C........0f.C........{..<..................$......., integer 72)
  #2 pmsrc/vendor/pocketmine/bedrock-protocol/src/PlayerAuthInputPacket(207): pocketmine\utils\BinaryStream->getVarInt()
  #3 pmsrc/vendor/pocketmine/bedrock-protocol/src/DataPacket(63): pocketmine\network\mcpe\protocol\PlayerAuthInputPacket->decodePayload(object pocketmine\network\mcpe\protocol\serializer\PacketSerializer#103084)
  #4 pmsrc/src/network/mcpe/NetworkSession(384): pocketmine\network\mcpe\protocol\DataPacket->decode(object pocketmine\network\mcpe\protocol\serializer\PacketSerializer#103084)
  #5 pmsrc/src/network/mcpe/NetworkSession(358): pocketmine\network\mcpe\NetworkSession->handleDataPacket(object pocketmine\network\mcpe\protocol\PlayerAuthInputPacket#103087, string[72] ..lj.B.......C...B...C........0f.C........{..
<..................$.......)
  #6 pmsrc/src/network/mcpe/raklib/RakLibInterface(192): pocketmine\network\mcpe\NetworkSession->handleEncoded(string[95] c.abd.b.jF...g..V'....]~....P9.........0..AA...?.[..&...C.A.....`dd.~..f.......0)
  #7 pmsrc/vendor/pocketmine/raklib-ipc/src/RakLibToUserThreadMessageReceiver(42): pocketmine\network\mcpe\raklib\RakLibInterface->onPacketReceive(integer 0, string[104] .$.....Y[)P.../....Q1...-.......=.i%.N.xt.....mK*...2.n..&..y}
....._7...q.......)
  #8 pmsrc/src/network/mcpe/raklib/RakLibInterface(122): raklib\server\ipc\RakLibToUserThreadMessageReceiver->handle(object pocketmine\network\mcpe\raklib\RakLibInterface#24938)
  #9 pmsrc/vendor/pocketmine/snooze/src/SleeperHandler(123): pocketmine\network\mcpe\raklib\RakLibInterface->pocketmine\network\mcpe\raklib\{closure}()
  #10 pmsrc/vendor/pocketmine/snooze/src/SleeperHandler(82): pocketmine\snooze\SleeperHandler->processNotifications()
  #11 pmsrc/src/Server(1615): pocketmine\snooze\SleeperHandler->sleepUntil(double 1636787505.2061)
  #12 pmsrc/src/Server(1028): pocketmine\Server->tickProcessor()
  #13 pmsrc/src/PocketMine(301): pocketmine\Server->__construct(object BaseClassLoader#2, object pocketmine\utils\MainLogger#3, string[47] D:\MCBE\PocketMine-MP-Projects\alvin-workspace\, string[55] D:\MCBE\PocketMine-MP-Projects\al
vin-workspace\plugins\)
  #14 pmsrc/src/PocketMine(324): pocketmine\server()
  #15 pmsrc(11): require(string[91] phar://D:/MCBE/PocketMine-MP-Projects/alvin-workspace/PocketMine-MP.phar/src/Poc)
--- End of exception information ---

BedrockProtocol version: 5.0.0+bedrock-1.17.40

CraftRecipeAutoStackRequestAction encoding/decoding is incorrect

I found this when implementing crafting on Dragonfly & testing out auto crafting on BDS through Gophertunnel, but it seems like the CraftRecipeAutoStackRequestAction encoding/decoding is slightly incorrect, as it's missing the times crafted byte at the end, which seems to have been added in 1.16.220.

I don't believe it's much of an issue for PM3, as if I recall correctly it still uses the old inventory system (not too sure about PM4), but for the sake of consistency I thought I'd point it out.

You can test out this behavior with the second to newest version of Gophertunnel by connecting to BDS and performing an auto craft.

Invalid command parameter types

Some parameter types in AvailableCommandsPacket have changed with the update 1.18.30 and are now invalid.


ARG_TYPE_WILDCARD_TARGET = 0x08 -> ARG_TYPE_WILDCARD_TARGET = 0x09
ARG_TYPE_STRING = 0x20 -> ARG_TYPE_STRING = 0x26
ARG_TYPE_POSITION = 0x28 -> ARG_TYPE_POSITION = 0x2F
ARG_TYPE_MESSAGE = 0x2c -> ARG_TYPE_MESSAGE = 0x32
ARG_TYPE_RAWTEXT = 0x2e -> ARG_TYPE_RAWTEXT = 0x34
ARG_TYPE_JSON = 0x32 -> ARG_TYPE_JSON = 0x38
ARG_TYPE_COMMAND = 0x3f -> ARG_TYPE_COMMAND = 0x45

and

ARG_TYPE_BLOCK_POSITION = 0x2E

This fact was not tested in detail!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.