From e47c7ea55f00f81a311f67a3a8bb35666afa93f1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 1 Apr 2017 15:30:59 +0100 Subject: [PATCH] A bunch of really dirty hacks to get 1.1.0.0 working Mojang: once again, what the hell have you done. --- src/pocketmine/Player.php | 6 +- src/pocketmine/network/Network.php | 6 +- .../network/mcpe/NetworkSession.php | 4 +- .../network/mcpe/RakLibInterface.php | 60 ++++---- .../network/mcpe/protocol/BatchPacket.php | 10 +- ...yerFallPacket.php => EntityFallPacket.php} | 6 +- .../network/mcpe/protocol/ProtocolInfo.php | 141 +++++++++--------- 7 files changed, 114 insertions(+), 119 deletions(-) rename src/pocketmine/network/mcpe/protocol/{PlayerFallPacket.php => EntityFallPacket.php} (87%) diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index 15ebddeaa..742126a27 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -148,7 +148,7 @@ use pocketmine\network\mcpe\protocol\MobEquipmentPacket; use pocketmine\network\mcpe\protocol\MoveEntityPacket; use pocketmine\network\mcpe\protocol\MovePlayerPacket; use pocketmine\network\mcpe\protocol\PlayerActionPacket; -use pocketmine\network\mcpe\protocol\PlayerFallPacket; +use pocketmine\network\mcpe\protocol\EntityFallPacket; use pocketmine\network\mcpe\protocol\PlayerInputPacket; use pocketmine\network\mcpe\protocol\PlayerListPacket; use pocketmine\network\mcpe\protocol\PlaySoundPacket; @@ -2735,7 +2735,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade return true; } - public function handlePlayerFall(PlayerFallPacket $packet) : bool{ + public function handleEntityFall(EntityFallPacket $packet) : bool{ return false; } @@ -3318,7 +3318,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade } public function handleUnknown(UnknownPacket $packet) : bool{ - $this->server->getLogger()->debug("Received unknown packet from " . $this->getName() . ": 0x" . bin2hex($packet->payload)); + $this->server->getLogger()->debug("Received unknown packet from " . $this->getName() . ": 0x" . bin2hex($packet->buffer)); return true; } diff --git a/src/pocketmine/network/Network.php b/src/pocketmine/network/Network.php index 1c3336269..30749376a 100644 --- a/src/pocketmine/network/Network.php +++ b/src/pocketmine/network/Network.php @@ -69,7 +69,7 @@ use pocketmine\network\mcpe\protocol\MobEquipmentPacket; use pocketmine\network\mcpe\protocol\MoveEntityPacket; use pocketmine\network\mcpe\protocol\MovePlayerPacket; use pocketmine\network\mcpe\protocol\PlayerActionPacket; -use pocketmine\network\mcpe\protocol\PlayerFallPacket; +use pocketmine\network\mcpe\protocol\EntityFallPacket; use pocketmine\network\mcpe\protocol\PlayerInputPacket; use pocketmine\network\mcpe\protocol\PlayerListPacket; use pocketmine\network\mcpe\protocol\PlaySoundPacket; @@ -285,7 +285,7 @@ class Network{ $this->registerPacket(ProtocolInfo::ADVENTURE_SETTINGS_PACKET, AdventureSettingsPacket::class); $this->registerPacket(ProtocolInfo::ANIMATE_PACKET, AnimatePacket::class); $this->registerPacket(ProtocolInfo::AVAILABLE_COMMANDS_PACKET, AvailableCommandsPacket::class); - $this->registerPacket(ProtocolInfo::BATCH_PACKET, BatchPacket::class); + $this->registerPacket(0xfe, BatchPacket::class); $this->registerPacket(ProtocolInfo::BLOCK_ENTITY_DATA_PACKET, BlockEntityDataPacket::class); $this->registerPacket(ProtocolInfo::BLOCK_EVENT_PACKET, BlockEventPacket::class); $this->registerPacket(ProtocolInfo::BLOCK_PICK_REQUEST_PACKET, BlockPickRequestPacket::class); @@ -305,6 +305,7 @@ class Network{ $this->registerPacket(ProtocolInfo::DISCONNECT_PACKET, DisconnectPacket::class); $this->registerPacket(ProtocolInfo::DROP_ITEM_PACKET, DropItemPacket::class); $this->registerPacket(ProtocolInfo::ENTITY_EVENT_PACKET, EntityEventPacket::class); + $this->registerPacket(ProtocolInfo::ENTITY_FALL_PACKET, EntityFallPacket::class); $this->registerPacket(ProtocolInfo::EXPLODE_PACKET, ExplodePacket::class); $this->registerPacket(ProtocolInfo::FULL_CHUNK_DATA_PACKET, FullChunkDataPacket::class); $this->registerPacket(ProtocolInfo::HURT_ARMOR_PACKET, HurtArmorPacket::class); @@ -320,7 +321,6 @@ class Network{ $this->registerPacket(ProtocolInfo::MOVE_ENTITY_PACKET, MoveEntityPacket::class); $this->registerPacket(ProtocolInfo::MOVE_PLAYER_PACKET, MovePlayerPacket::class); $this->registerPacket(ProtocolInfo::PLAYER_ACTION_PACKET, PlayerActionPacket::class); - $this->registerPacket(ProtocolInfo::PLAYER_FALL_PACKET, PlayerFallPacket::class); $this->registerPacket(ProtocolInfo::PLAYER_INPUT_PACKET, PlayerInputPacket::class); $this->registerPacket(ProtocolInfo::PLAYER_LIST_PACKET, PlayerListPacket::class); $this->registerPacket(ProtocolInfo::PLAY_SOUND_PACKET, PlaySoundPacket::class); diff --git a/src/pocketmine/network/mcpe/NetworkSession.php b/src/pocketmine/network/mcpe/NetworkSession.php index 1d1892e0c..4eeed453d 100644 --- a/src/pocketmine/network/mcpe/NetworkSession.php +++ b/src/pocketmine/network/mcpe/NetworkSession.php @@ -68,7 +68,7 @@ use pocketmine\network\mcpe\protocol\MobEquipmentPacket; use pocketmine\network\mcpe\protocol\MoveEntityPacket; use pocketmine\network\mcpe\protocol\MovePlayerPacket; use pocketmine\network\mcpe\protocol\PlayerActionPacket; -use pocketmine\network\mcpe\protocol\PlayerFallPacket; +use pocketmine\network\mcpe\protocol\EntityFallPacket; use pocketmine\network\mcpe\protocol\PlayerInputPacket; use pocketmine\network\mcpe\protocol\PlayerListPacket; use pocketmine\network\mcpe\protocol\PlaySoundPacket; @@ -191,7 +191,7 @@ interface NetworkSession{ public function handlePlayerAction(PlayerActionPacket $packet) : bool; - public function handlePlayerFall(PlayerFallPacket $packet) : bool; + public function handleEntityFall(EntityFallPacket $packet) : bool; public function handleHurtArmor(HurtArmorPacket $packet) : bool; diff --git a/src/pocketmine/network/mcpe/RakLibInterface.php b/src/pocketmine/network/mcpe/RakLibInterface.php index de31bab8c..455c818ae 100644 --- a/src/pocketmine/network/mcpe/RakLibInterface.php +++ b/src/pocketmine/network/mcpe/RakLibInterface.php @@ -23,6 +23,7 @@ namespace pocketmine\network\mcpe; use pocketmine\event\player\PlayerCreationEvent; use pocketmine\network\AdvancedSourceInterface; +use pocketmine\network\mcpe\protocol\BatchPacket; use pocketmine\network\mcpe\protocol\DataPacket; use pocketmine\network\mcpe\protocol\ProtocolInfo; use pocketmine\network\Network; @@ -190,42 +191,38 @@ class RakLibInterface implements ServerInstance, AdvancedSourceInterface{ public function putPacket(Player $player, DataPacket $packet, $needACK = false, $immediate = false){ if(isset($this->identifiers[$h = spl_object_hash($player)])){ $identifier = $this->identifiers[$h]; - $pk = null; if(!$packet->isEncoded){ $packet->encode(); $packet->isEncoded = true; - }elseif(!$needACK){ - if(!isset($packet->__encapsulatedPacket)){ - $packet->__encapsulatedPacket = new CachedEncapsulatedPacket; - $packet->__encapsulatedPacket->identifierACK = null; - $packet->__encapsulatedPacket->buffer = chr(0xfe) . $packet->buffer; // #blameshoghi - $packet->__encapsulatedPacket->reliability = PacketReliability::RELIABLE_ORDERED; - $packet->__encapsulatedPacket->orderChannel = 0; - } - $pk = $packet->__encapsulatedPacket; } - if(!$immediate and !$needACK and $packet->canBeBatched() - and Network::$BATCH_THRESHOLD >= 0 - and strlen($packet->buffer) >= Network::$BATCH_THRESHOLD){ + if($packet instanceof BatchPacket){ + if($needACK){ + $pk = new EncapsulatedPacket(); + $pk->buffer = $packet->buffer; + $pk->reliability = PacketReliability::RELIABLE_ORDERED; + $pk->orderChannel = 0; + + if($needACK === true){ + $pk->identifierACK = $this->identifiersACK[$identifier]++; + } + }else{ + if(!isset($packet->__encapsulatedPacket)){ + $packet->__encapsulatedPacket = new CachedEncapsulatedPacket; + $packet->__encapsulatedPacket->identifierACK = null; + $packet->__encapsulatedPacket->buffer = $packet->buffer; // #blameshoghi + $packet->__encapsulatedPacket->reliability = PacketReliability::RELIABLE_ORDERED; + $packet->__encapsulatedPacket->orderChannel = 0; + } + $pk = $packet->__encapsulatedPacket; + } + + $this->interface->sendEncapsulated($identifier, $pk, ($needACK === true ? RakLib::FLAG_NEED_ACK : 0) | ($immediate === true ? RakLib::PRIORITY_IMMEDIATE : RakLib::PRIORITY_NORMAL)); + return $pk->identifierACK; + }else{ $this->server->batchPackets([$player], [$packet], true); return null; } - - if($pk === null){ - $pk = new EncapsulatedPacket(); - $pk->buffer = chr(0xfe) . $packet->buffer; // #blameshoghi - $pk->reliability = PacketReliability::RELIABLE_ORDERED; - $pk->orderChannel = 0; - - if($needACK === true){ - $pk->identifierACK = $this->identifiersACK[$identifier]++; - } - } - - $this->interface->sendEncapsulated($identifier, $pk, ($needACK === true ? RakLib::FLAG_NEED_ACK : 0) | ($immediate === true ? RakLib::PRIORITY_IMMEDIATE : RakLib::PRIORITY_NORMAL)); - - return $pk->identifierACK; } return null; @@ -233,15 +230,10 @@ class RakLibInterface implements ServerInstance, AdvancedSourceInterface{ private function getPacket($buffer){ $pid = ord($buffer{0}); - $start = 1; - if($pid == 0xfe){ - $pid = ord($buffer{1}); - $start++; - } if(($data = $this->network->getPacket($pid)) === null){ return null; } - $data->setBuffer($buffer, $start); + $data->setBuffer($buffer, 1); return $data; } diff --git a/src/pocketmine/network/mcpe/protocol/BatchPacket.php b/src/pocketmine/network/mcpe/protocol/BatchPacket.php index a288b24c4..7034d438e 100644 --- a/src/pocketmine/network/mcpe/protocol/BatchPacket.php +++ b/src/pocketmine/network/mcpe/protocol/BatchPacket.php @@ -27,7 +27,7 @@ namespace pocketmine\network\mcpe\protocol; use pocketmine\network\mcpe\NetworkSession; class BatchPacket extends DataPacket{ - const NETWORK_ID = ProtocolInfo::BATCH_PACKET; + const NETWORK_ID = 0xfe; public $payload; @@ -40,12 +40,12 @@ class BatchPacket extends DataPacket{ } public function decode(){ - $this->payload = $this->getString(); + $this->payload = $this->get(true); } public function encode(){ $this->reset(); - $this->putString($this->payload); + $this->put($this->payload); } public function handle(NetworkSession $session) : bool{ @@ -66,9 +66,9 @@ class BatchPacket extends DataPacket{ while(!$this->feof()){ $buf = $this->getString(); $pk = $network->getPacket(ord($buf{0})); - if(!$pk->canBeBatched()){ + /*if(!$pk->canBeBatched()){ throw new \InvalidArgumentException("Received invalid " . get_class($pk) . " inside BatchPacket"); - } + }*/ $pk->setBuffer($buf, 1); $session->handleDataPacket($pk); diff --git a/src/pocketmine/network/mcpe/protocol/PlayerFallPacket.php b/src/pocketmine/network/mcpe/protocol/EntityFallPacket.php similarity index 87% rename from src/pocketmine/network/mcpe/protocol/PlayerFallPacket.php rename to src/pocketmine/network/mcpe/protocol/EntityFallPacket.php index d254f21ed..cd166f93f 100644 --- a/src/pocketmine/network/mcpe/protocol/PlayerFallPacket.php +++ b/src/pocketmine/network/mcpe/protocol/EntityFallPacket.php @@ -26,8 +26,8 @@ namespace pocketmine\network\mcpe\protocol; use pocketmine\network\mcpe\NetworkSession; -class PlayerFallPacket extends DataPacket{ - const NETWORK_ID = ProtocolInfo::PLAYER_FALL_PACKET; +class EntityFallPacket extends DataPacket{ + const NETWORK_ID = ProtocolInfo::ENTITY_FALL_PACKET; public $fallDistance; @@ -40,6 +40,6 @@ class PlayerFallPacket extends DataPacket{ } public function handle(NetworkSession $session) : bool{ - return $session->handlePlayerFall($this); + return $session->handleEntityFall($this); } } diff --git a/src/pocketmine/network/mcpe/protocol/ProtocolInfo.php b/src/pocketmine/network/mcpe/protocol/ProtocolInfo.php index 3a5fa1114..758c47077 100644 --- a/src/pocketmine/network/mcpe/protocol/ProtocolInfo.php +++ b/src/pocketmine/network/mcpe/protocol/ProtocolInfo.php @@ -31,74 +31,74 @@ interface ProtocolInfo{ /** * Actual Minecraft: PE protocol version */ - const CURRENT_PROTOCOL = 105; - const MINECRAFT_VERSION = "v1.0.5.0 beta"; - const MINECRAFT_VERSION_NETWORK = "1.0.5.0"; + const CURRENT_PROTOCOL = 110; + const MINECRAFT_VERSION = "v1.1.0.0 beta"; + const MINECRAFT_VERSION_NETWORK = "1.1.0.0"; const LOGIN_PACKET = 0x01; const PLAY_STATUS_PACKET = 0x02; const SERVER_TO_CLIENT_HANDSHAKE_PACKET = 0x03; const CLIENT_TO_SERVER_HANDSHAKE_PACKET = 0x04; const DISCONNECT_PACKET = 0x05; - const BATCH_PACKET = 0x06; - const RESOURCE_PACKS_INFO_PACKET = 0x07; - const RESOURCE_PACK_STACK_PACKET = 0x08; //ResourcePacksStackPacket - const RESOURCE_PACK_CLIENT_RESPONSE_PACKET = 0x09; - const TEXT_PACKET = 0x0a; - const SET_TIME_PACKET = 0x0b; - const START_GAME_PACKET = 0x0c; - const ADD_PLAYER_PACKET = 0x0d; - const ADD_ENTITY_PACKET = 0x0e; - const REMOVE_ENTITY_PACKET = 0x0f; - const ADD_ITEM_ENTITY_PACKET = 0x10; - const ADD_HANGING_ENTITY_PACKET = 0x11; - const TAKE_ITEM_ENTITY_PACKET = 0x12; - const MOVE_ENTITY_PACKET = 0x13; - const MOVE_PLAYER_PACKET = 0x14; - const RIDER_JUMP_PACKET = 0x15; - const REMOVE_BLOCK_PACKET = 0x16; - const UPDATE_BLOCK_PACKET = 0x17; - const ADD_PAINTING_PACKET = 0x18; - const EXPLODE_PACKET = 0x19; - const LEVEL_SOUND_EVENT_PACKET = 0x1a; - const LEVEL_EVENT_PACKET = 0x1b; - const BLOCK_EVENT_PACKET = 0x1c; - const ENTITY_EVENT_PACKET = 0x1d; - const MOB_EFFECT_PACKET = 0x1e; - const UPDATE_ATTRIBUTES_PACKET = 0x1f; - const MOB_EQUIPMENT_PACKET = 0x20; - const MOB_ARMOR_EQUIPMENT_PACKET = 0x21; - const INTERACT_PACKET = 0x22; - const BLOCK_PICK_REQUEST_PACKET = 0x23; - const USE_ITEM_PACKET = 0x24; - const PLAYER_ACTION_PACKET = 0x25; - const PLAYER_FALL_PACKET = 0x26; - const HURT_ARMOR_PACKET = 0x27; - const SET_ENTITY_DATA_PACKET = 0x28; - const SET_ENTITY_MOTION_PACKET = 0x29; - const SET_ENTITY_LINK_PACKET = 0x2a; - const SET_HEALTH_PACKET = 0x2b; - const SET_SPAWN_POSITION_PACKET = 0x2c; - const ANIMATE_PACKET = 0x2d; - const RESPAWN_PACKET = 0x2e; - const DROP_ITEM_PACKET = 0x2f; - const INVENTORY_ACTION_PACKET = 0x30; - const CONTAINER_OPEN_PACKET = 0x31; - const CONTAINER_CLOSE_PACKET = 0x32; - const CONTAINER_SET_SLOT_PACKET = 0x33; - const CONTAINER_SET_DATA_PACKET = 0x34; - const CONTAINER_SET_CONTENT_PACKET = 0x35; - const CRAFTING_DATA_PACKET = 0x36; - const CRAFTING_EVENT_PACKET = 0x37; - const ADVENTURE_SETTINGS_PACKET = 0x38; - const BLOCK_ENTITY_DATA_PACKET = 0x39; - const PLAYER_INPUT_PACKET = 0x3a; - const FULL_CHUNK_DATA_PACKET = 0x3b; - const SET_COMMANDS_ENABLED_PACKET = 0x3c; - const SET_DIFFICULTY_PACKET = 0x3d; - const CHANGE_DIMENSION_PACKET = 0x3e; - const SET_PLAYER_GAME_TYPE_PACKET = 0x3f; - const PLAYER_LIST_PACKET = 0x40; + const RESOURCE_PACKS_INFO_PACKET = 0x06; + const RESOURCE_PACK_STACK_PACKET = 0x07; //ResourcePacksStackPacket + const RESOURCE_PACK_CLIENT_RESPONSE_PACKET = 0x08; + const TEXT_PACKET = 0x09; + const SET_TIME_PACKET = 0x0a; + const START_GAME_PACKET = 0x0b; + const ADD_PLAYER_PACKET = 0x0c; + const ADD_ENTITY_PACKET = 0x0d; + const REMOVE_ENTITY_PACKET = 0x0e; + const ADD_ITEM_ENTITY_PACKET = 0x0f; + const ADD_HANGING_ENTITY_PACKET = 0x10; + const TAKE_ITEM_ENTITY_PACKET = 0x11; + const MOVE_ENTITY_PACKET = 0x12; + const MOVE_PLAYER_PACKET = 0x13; + const RIDER_JUMP_PACKET = 0x14; + const REMOVE_BLOCK_PACKET = 0x15; + const UPDATE_BLOCK_PACKET = 0x16; + const ADD_PAINTING_PACKET = 0x17; + const EXPLODE_PACKET = 0x18; + const LEVEL_SOUND_EVENT_PACKET = 0x19; + const LEVEL_EVENT_PACKET = 0x1a; + const BLOCK_EVENT_PACKET = 0x1b; + const ENTITY_EVENT_PACKET = 0x1c; + const MOB_EFFECT_PACKET = 0x1d; + const UPDATE_ATTRIBUTES_PACKET = 0x1e; + const MOB_EQUIPMENT_PACKET = 0x1f; + const MOB_ARMOR_EQUIPMENT_PACKET = 0x20; + const INTERACT_PACKET = 0x21; + const BLOCK_PICK_REQUEST_PACKET = 0x22; + const USE_ITEM_PACKET = 0x23; + const PLAYER_ACTION_PACKET = 0x24; + const ENTITY_FALL_PACKET = 0x25; //PlayerFallPacket + const HURT_ARMOR_PACKET = 0x26; + const SET_ENTITY_DATA_PACKET = 0x27; + const SET_ENTITY_MOTION_PACKET = 0x28; + const SET_ENTITY_LINK_PACKET = 0x29; + const SET_HEALTH_PACKET = 0x2a; + const SET_SPAWN_POSITION_PACKET = 0x2b; + const ANIMATE_PACKET = 0x2c; + const RESPAWN_PACKET = 0x2d; + const DROP_ITEM_PACKET = 0x2e; + const INVENTORY_ACTION_PACKET = 0x2f; + const CONTAINER_OPEN_PACKET = 0x30; + const CONTAINER_CLOSE_PACKET = 0x31; + const CONTAINER_SET_SLOT_PACKET = 0x32; + const CONTAINER_SET_DATA_PACKET = 0x33; + const CONTAINER_SET_CONTENT_PACKET = 0x34; + const CRAFTING_DATA_PACKET = 0x35; + const CRAFTING_EVENT_PACKET = 0x36; + const ADVENTURE_SETTINGS_PACKET = 0x37; + const BLOCK_ENTITY_DATA_PACKET = 0x38; + const PLAYER_INPUT_PACKET = 0x39; + const FULL_CHUNK_DATA_PACKET = 0x3a; + const SET_COMMANDS_ENABLED_PACKET = 0x3b; + const SET_DIFFICULTY_PACKET = 0x3c; + const CHANGE_DIMENSION_PACKET = 0x3d; + const SET_PLAYER_GAME_TYPE_PACKET = 0x3e; + const PLAYER_LIST_PACKET = 0x3f; + const SIMPLE_EVENT_PACKET = 0x40; const EVENT_PACKET = 0x41; //TelemetryEventPacket const SPAWN_EXPERIENCE_ORB_PACKET = 0x42; const CLIENTBOUND_MAP_ITEM_DATA_PACKET = 0x43; //MapItemDataPacket @@ -116,12 +116,15 @@ interface ProtocolInfo{ const COMMAND_STEP_PACKET = 0x4f; const COMMAND_BLOCK_UPDATE_PACKET = 0x50; const UPDATE_TRADE_PACKET = 0x51; - const RESOURCE_PACK_DATA_INFO_PACKET = 0x52; - const RESOURCE_PACK_CHUNK_DATA_PACKET = 0x53; - const RESOURCE_PACK_CHUNK_REQUEST_PACKET = 0x54; - const TRANSFER_PACKET = 0x55; - const PLAY_SOUND_PACKET = 0x56; - const STOP_SOUND_PACKET = 0x57; - const SET_TITLE_PACKET = 0x58; + const UPDATE_EQUIP_PACKET = 0x52; + const RESOURCE_PACK_DATA_INFO_PACKET = 0x53; + const RESOURCE_PACK_CHUNK_DATA_PACKET = 0x54; + const RESOURCE_PACK_CHUNK_REQUEST_PACKET = 0x55; + const TRANSFER_PACKET = 0x56; + const PLAY_SOUND_PACKET = 0x57; + const STOP_SOUND_PACKET = 0x58; + const SET_TITLE_PACKET = 0x59; + const ADD_BEHAVIOR_TREE_PACKET = 0x5a; + const STRUCTURE_BLOCK_UPDATE_PACKET = 0x5b; }