diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index fc4d99ed1..072747848 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,5 +1,6 @@ ### Issue description + Write a short description about the issue ### Steps to reproduce the issue diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index 93d5fd1fa..75e1ad3c8 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -183,6 +183,7 @@ use pocketmine\network\mcpe\protocol\TransferPacket; use pocketmine\network\mcpe\protocol\UnknownPacket; use pocketmine\network\mcpe\protocol\UpdateAttributesPacket; use pocketmine\network\mcpe\protocol\UpdateBlockPacket; +use pocketmine\network\mcpe\protocol\UpdateTradePacket; use pocketmine\network\mcpe\protocol\UseItemPacket; use pocketmine\network\SourceInterface; use pocketmine\permission\PermissibleBase; @@ -771,21 +772,12 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade $level = $level === null ? $this->level : $level; $index = Level::chunkHash($x, $z); if(isset($this->usedChunks[$index])){ - $chunk = $level->getChunk($x, $z); - foreach($chunk->getEntities() as $entity){ + foreach($level->getChunkEntities($x, $z) as $entity){ if($entity !== $this){ $entity->despawnFrom($this); } } - if($level !== $this->level){ - $pk = new FullChunkDataPacket(); - $pk->chunkX = $x; - $pk->chunkZ = $z; - $pk->data = chr($chunk->getSubChunkSendCount()); - $this->dataPacket($pk); - } - unset($this->usedChunks[$index]); } $level->unregisterChunkLoader($this, $x, $z); @@ -3287,6 +3279,10 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade return true; } + public function handleUpdateTrade(UpdateTradePacket $packet) : bool{ + return false; + } + public function handleResourcePackDataInfo(ResourcePackDataInfoPacket $packet) : bool{ return false; } diff --git a/src/pocketmine/entity/Entity.php b/src/pocketmine/entity/Entity.php index 804d75176..a3509fd33 100644 --- a/src/pocketmine/entity/Entity.php +++ b/src/pocketmine/entity/Entity.php @@ -109,6 +109,14 @@ abstract class Entity extends Location implements Metadatable{ * 58 (byte) * 59 (float) * 60 (float) */ + const DATA_AREA_EFFECT_CLOUD_RADIUS = 61; //float + const DATA_AREA_EFFECT_CLOUD_WAITING = 62; //int + const DATA_AREA_EFFECT_CLOUD_PARTICLE_ID = 63; //int + /* 64 (int), shulker-related + * 65 (byte), shulker-related + * 66 (short) shulker-related + * 67 (unknown), shulker-related */ + const DATA_TRADING_PLAYER_EID = 68; //long const DATA_FLAG_ONFIRE = 0; diff --git a/src/pocketmine/inventory/InventoryType.php b/src/pocketmine/inventory/InventoryType.php index d5fea2604..86d1a3ddd 100644 --- a/src/pocketmine/inventory/InventoryType.php +++ b/src/pocketmine/inventory/InventoryType.php @@ -21,10 +21,14 @@ namespace pocketmine\inventory; +use pocketmine\network\mcpe\protocol\types\InventoryNetworkIds; + /** * Saves all the information regarding default inventory sizes and types */ class InventoryType{ + + //NOTE: Do not confuse these with the network IDs. const CHEST = 0; const DOUBLE_CHEST = 1; const PLAYER = 2; @@ -56,19 +60,19 @@ class InventoryType{ return; } - static::$default[static::CHEST] = new InventoryType(27, "Chest", 0); - static::$default[static::DOUBLE_CHEST] = new InventoryType(27 + 27, "Double Chest", 0); - static::$default[static::PLAYER] = new InventoryType(36 + 4, "Player", 0); //36 CONTAINER, 4 ARMOR - static::$default[static::CRAFTING] = new InventoryType(5, "Crafting", 1); //4 CRAFTING slots, 1 RESULT - static::$default[static::WORKBENCH] = new InventoryType(10, "Crafting", 1); //9 CRAFTING slots, 1 RESULT - static::$default[static::FURNACE] = new InventoryType(3, "Furnace", 2); //2 INPUT, 1 OUTPUT - static::$default[static::ENCHANT_TABLE] = new InventoryType(2, "Enchant", 3); //1 INPUT/OUTPUT, 1 LAPIS - static::$default[static::BREWING_STAND] = new InventoryType(4, "Brewing", 4); //1 INPUT, 3 POTION - static::$default[static::ANVIL] = new InventoryType(3, "Anvil", 5); //2 INPUT, 1 OUTPUT - //TODO: add the below - //6: dispenser - //7: dropper - //8: hopper + //TODO: move network stuff out of here + //TODO: move inventory data to json + static::$default = [ + static::CHEST => new InventoryType(27, "Chest", InventoryNetworkIds::CONTAINER), + static::DOUBLE_CHEST => new InventoryType(27 + 27, "Double Chest", InventoryNetworkIds::CONTAINER), + static::PLAYER => new InventoryType(36 + 4, "Player", InventoryNetworkIds::INVENTORY), //36 CONTAINER, 4 ARMOR + static::CRAFTING => new InventoryType(5, "Crafting", InventoryNetworkIds::INVENTORY), //yes, the use of INVENTORY is intended! 4 CRAFTING slots, 1 RESULT + static::WORKBENCH => new InventoryType(10, "Crafting", InventoryNetworkIds::WORKBENCH), //9 CRAFTING slots, 1 RESULT + static::FURNACE => new InventoryType(3, "Furnace", InventoryNetworkIds::FURNACE), //2 INPUT, 1 OUTPUT + static::ENCHANT_TABLE => new InventoryType(2, "Enchant", InventoryNetworkIds::ENCHANTMENT), //1 INPUT/OUTPUT, 1 LAPIS + static::BREWING_STAND => new InventoryType(4, "Brewing", InventoryNetworkIds::BREWING_STAND), //1 INPUT, 3 POTION + static::ANVIL => new InventoryType(3, "Anvil", InventoryNetworkIds::ANVIL) //2 INPUT, 1 OUTP + ]; } /** diff --git a/src/pocketmine/network/Network.php b/src/pocketmine/network/Network.php index 3a548ee50..49e00b370 100644 --- a/src/pocketmine/network/Network.php +++ b/src/pocketmine/network/Network.php @@ -101,6 +101,7 @@ use pocketmine\network\mcpe\protocol\TextPacket; use pocketmine\network\mcpe\protocol\TransferPacket; use pocketmine\network\mcpe\protocol\UnknownPacket; use pocketmine\network\mcpe\protocol\UpdateBlockPacket; +use pocketmine\network\mcpe\protocol\UpdateTradePacket; use pocketmine\network\mcpe\protocol\UseItemPacket; use pocketmine\Player; use pocketmine\Server; @@ -381,6 +382,7 @@ class Network{ $this->registerPacket(ProtocolInfo::TEXT_PACKET, TextPacket::class); $this->registerPacket(ProtocolInfo::TRANSFER_PACKET, TransferPacket::class); $this->registerPacket(ProtocolInfo::UPDATE_BLOCK_PACKET, UpdateBlockPacket::class); + $this->registerPacket(ProtocolInfo::UPDATE_TRADE_PACKET, UpdateTradePacket::class); $this->registerPacket(ProtocolInfo::USE_ITEM_PACKET, UseItemPacket::class); } } diff --git a/src/pocketmine/network/mcpe/NetworkSession.php b/src/pocketmine/network/mcpe/NetworkSession.php index 62786b8f2..ae790ae9e 100644 --- a/src/pocketmine/network/mcpe/NetworkSession.php +++ b/src/pocketmine/network/mcpe/NetworkSession.php @@ -101,6 +101,7 @@ use pocketmine\network\mcpe\protocol\TransferPacket; use pocketmine\network\mcpe\protocol\UnknownPacket; use pocketmine\network\mcpe\protocol\UpdateAttributesPacket; use pocketmine\network\mcpe\protocol\UpdateBlockPacket; +use pocketmine\network\mcpe\protocol\UpdateTradePacket; use pocketmine\network\mcpe\protocol\UseItemPacket; interface NetworkSession{ @@ -261,6 +262,8 @@ interface NetworkSession{ public function handleCommandStep(CommandStepPacket $packet) : bool; + public function handleUpdateTrade(UpdateTradePacket $packet) : bool; + public function handleResourcePackDataInfo(ResourcePackDataInfoPacket $packet) : bool; public function handleResourcePackChunkData(ResourcePackChunkDataPacket $packet) : bool; diff --git a/src/pocketmine/network/mcpe/protocol/LevelSoundEventPacket.php b/src/pocketmine/network/mcpe/protocol/LevelSoundEventPacket.php index f55d936fa..63d07cc51 100644 --- a/src/pocketmine/network/mcpe/protocol/LevelSoundEventPacket.php +++ b/src/pocketmine/network/mcpe/protocol/LevelSoundEventPacket.php @@ -49,7 +49,7 @@ class LevelSoundEventPacket extends DataPacket{ const SOUND_MAD = 18; const SOUND_BOOST = 19; const SOUND_BOW = 20; - const SOUND_SQUISH_BIG = 21; + const SOUND_SQUISH_BIG = 21; const SOUND_SQUISH_SMALL = 22; const SOUND_FALL_BIG = 23; const SOUND_FALL_SMALL = 24; @@ -112,14 +112,18 @@ class LevelSoundEventPacket extends DataPacket{ const SOUND_BUCKET_EMPTY_WATER = 81; const SOUND_BUCKET_EMPTY_LAVA = 82; const SOUND_GUARDIAN_FLOP = 83; - const SOUND_ELDERGUARDIAN_CURSE = 84; + const SOUND_MOB_ELDERGUARDIAN_CURSE = 84; const SOUND_MOB_WARNING = 85; const SOUND_MOB_WARNING_BABY = 86; const SOUND_TELEPORT = 87; const SOUND_SHULKER_OPEN = 88; const SOUND_SHULKER_CLOSE = 89; - const SOUND_DEFAULT = 90; - const SOUND_UNDEFINED = 91; + const SOUND_HAGGLE = 90; + const SOUND_HAGGLE_YES = 91; + const SOUND_HAGGLE_NO = 92; + const SOUND_HAGGLE_IDLE = 93; + const SOUND_DEFAULT = 94; + const SOUND_UNDEFINED = 95; public $sound; public $x; diff --git a/src/pocketmine/network/mcpe/protocol/ProtocolInfo.php b/src/pocketmine/network/mcpe/protocol/ProtocolInfo.php index 5ef62ca06..b95344940 100644 --- a/src/pocketmine/network/mcpe/protocol/ProtocolInfo.php +++ b/src/pocketmine/network/mcpe/protocol/ProtocolInfo.php @@ -30,9 +30,9 @@ interface ProtocolInfo{ /** * Actual Minecraft: PE protocol version */ - const CURRENT_PROTOCOL = 101; - const MINECRAFT_VERSION = "v1.0.3.0"; - const MINECRAFT_VERSION_NETWORK = "1.0.3.0"; + const CURRENT_PROTOCOL = 102; + const MINECRAFT_VERSION = "v1.0.4.1 beta"; + const MINECRAFT_VERSION_NETWORK = "1.0.4.1"; const LOGIN_PACKET = 0x01; const PLAY_STATUS_PACKET = 0x02; @@ -112,9 +112,10 @@ interface ProtocolInfo{ const SHOW_CREDITS_PACKET = 0x4c; const AVAILABLE_COMMANDS_PACKET = 0x4d; const COMMAND_STEP_PACKET = 0x4e; - const RESOURCE_PACK_DATA_INFO_PACKET = 0x4f; - const RESOURCE_PACK_CHUNK_DATA_PACKET = 0x50; - const RESOURCE_PACK_CHUNK_REQUEST_PACKET = 0x51; - const TRANSFER_PACKET = 0x52; + const UPDATE_TRADE_PACKET = 0x4f; + const RESOURCE_PACK_DATA_INFO_PACKET = 0x50; + const RESOURCE_PACK_CHUNK_DATA_PACKET = 0x51; + const RESOURCE_PACK_CHUNK_REQUEST_PACKET = 0x52; + const TRANSFER_PACKET = 0x53; } diff --git a/src/pocketmine/network/mcpe/protocol/UpdateTradePacket.php b/src/pocketmine/network/mcpe/protocol/UpdateTradePacket.php new file mode 100644 index 000000000..8b13bb4c1 --- /dev/null +++ b/src/pocketmine/network/mcpe/protocol/UpdateTradePacket.php @@ -0,0 +1,72 @@ + + + +use pocketmine\network\mcpe\NetworkSession; + +class UpdateTradePacket extends DataPacket{ + const NETWORK_ID = ProtocolInfo::UPDATE_TRADE_PACKET; + + //TODO: find fields + public $byte1; + public $byte2; + public $varint1; + public $varint2; + public $isWilling; + public $traderEid; + public $playerEid; + public $displayName; + public $offers; + + public function decode(){ + $this->byte1 = $this->getByte(); + $this->byte2 = $this->getByte(); + $this->varint1 = $this->getVarInt(); + $this->varint2 = $this->getVarInt(); + $this->isWilling = $this->getBool(); + $this->traderEid = $this->getEntityUniqueId(); + $this->playerEid = $this->getEntityUniqueId(); + $this->displayName = $this->getString(); + $this->offers = $this->get(true); + } + + public function encode(){ + $this->reset(); + $this->putByte($this->byte1); + $this->putByte($this->byte2); + $this->putVarInt($this->varint1); + $this->putVarInt($this->varint2); + $this->putBool($this->isWilling); + $this->putEntityUniqueId($this->traderEid); + $this->putEntityUniqueId($this->playerEid); + $this->putString($this->displayName); + $this->put($this->offers); + } + + public function handle(NetworkSession $session) : bool{ + return $session->handleUpdateTrade($this); + } +} \ No newline at end of file diff --git a/src/pocketmine/network/mcpe/protocol/types/InventoryNetworkIds.php b/src/pocketmine/network/mcpe/protocol/types/InventoryNetworkIds.php new file mode 100644 index 000000000..671010b02 --- /dev/null +++ b/src/pocketmine/network/mcpe/protocol/types/InventoryNetworkIds.php @@ -0,0 +1,42 @@ +