A bunch of really dirty hacks to get 1.1.0.0 working

Mojang: once again, what the hell have you done.
This commit is contained in:
Dylan K. Taylor 2017-04-01 15:30:59 +01:00
parent f75cc93160
commit e47c7ea55f
7 changed files with 114 additions and 119 deletions

View File

@ -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;
}

View File

@ -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);

View File

@ -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;

View File

@ -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;
}

View File

@ -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);

View File

@ -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);
}
}

View File

@ -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;
}