https://wiki.vg/api.php?action=feedcontributions&user=Gurun&feedformat=atom
wiki.vg - User contributions [en]
2024-03-29T01:20:00Z
User contributions
MediaWiki 1.34.4
https://wiki.vg/index.php?title=Pocket_Edition_Protocol_Documentation&diff=7992
Pocket Edition Protocol Documentation
2016-06-19T15:21:18Z
<p>Gurun: </p>
<hr />
<div>This is the (unofficial) protocol documentation for {{Minecraft Wiki|Minecraft Pocket Edition}}. The protocol currently uses [[Wikipedia:UDP|UDP]] for communication, different from PC (which uses [[Wikipedia:TCP|TCP]]). The usual UDP issues are still here (lost packets, wrong order, etc.), but the protocol solves a few of those problems using special packet encapsulation, based on TCP. The Minecraft: PE client uses [http://www.raknet.com/ RakNet] as its networking library. Even though it uses RakNet, you can still write software without the library.<br />
<br />
Currently, the game's default port is 19132. It is recommended to use this when possible because processes such as server discovering will not work otherwise.<br />
<br />
== Data Types ==<br />
Minecraft packets use different data types to communicate with each other. The documented ones are listed below:<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" |<br />
! class="col1" | Size<br />
! class="col2" | Range<br />
! class="col3" | Notes<br />
|- class="row1"<br />
! class="col0 centeralign" | byte<br />
| class="col1 centeralign" | 1<br />
| class="col2" | 0 to 255<br />
| class="col3" | <code></code><br />
|- class="row2"<br />
! class="col0 centeralign" | short<br />
| class="col1 centeralign" | 2<br />
| class="col2" | -32768 to 32767<br />
| class="col3" | <code></code><br />
|- class="row3"<br />
! class="col0 centeralign" | uint24le<br />
| class="col1 centeralign" | 3<br />
| class="col2" | 0 to 16777216<br />
| class="col3" | Little-Endian 24-bit unsigned integer. Commonly used by RakNet for counters.<br />
|- class="row4"<br />
! class="col0 centeralign" | int<br />
| class="col1 centeralign" | 4<br />
| class="col2" | -2147483648 to 2147483647<br />
| class="col3" | <code></code><br />
|- class="row5"<br />
! class="col0 centeralign" | long<br />
| class="col1 centeralign" | 8<br />
| class="col2" | <br />
| class="col3" | <code></code><br />
|- class="row6"<br />
! class="col0 centeralign" | MAGIC<br />
| class="col1 centeralign" | 16<br />
| class="col2" | <code>0x00ffff00fefefefefdfdfdfd12345678</code><br />
| class="col3" | always those hex bytes, corresponding to RakNet's default OFFLINE_MESSAGE_DATA_ID<br />
|- class="row7"<br />
! class="col0 centeralign" | string<br />
| class="col1 centeralign" | unsigned short + string<br />
| class="col2" | N/A<br />
| class="col3" | Prefixed by a short containing the length of the string in characters. It appears that only the following ASCII characters can be displayed: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~<br />
|- class="row8"<br />
! class="col0 centeralign" | address<br />
| class="col1 centeralign" | 7<br />
| class="col2" | N/A<br />
| class="col3" | IP Address and port. First byte is the version (0x04), then come the address bytes and finally an unsigned short for the port.<br />
|-<br />
! NBT<br />
| N/A<br />
| N/A<br />
| NBT data in PE is always ''little-endian''. This includes short, int, long, float, double tags and the length headers for arrays, strings and lists.<br />
|-<br />
! Item Stack<br />
| N/A<br />
| N/A<br />
| First short is the item ID. If this is not 0, then follows the item count ubyte. If this is also not 0, then follows the item data short and a ''little-endian'' short denoting the length of the following NBT data, or 0 for no NBT. Then follows an NBT tag described above of that length.<br />
|-<br />
! UUID<br />
| 16<br />
| 00000000-0000-0000-0000-000000000000 <br />
to ffffffff-ffff-ffff-ffff-ffffffffffff<br />
| <br />
|-<br />
! Position<br />
| 12<br />
| N/A<br />
| Three consecutive floats for x, y and z respectively.<br />
|-<br />
! Block Position<br />
| 12<br />
| N/A<br />
| Three consecutive ints for x, y and z respectively.<br />
|}<br />
<br />
== Packet format ==<br />
All packets in Minecraft: Pocket Edition start with their ID, which is an unsigned byte. If you are using a language which does not support unsigned types such as Java, you can do (byte & 0xFF) to get the unsigned version.<br />
<br />
== RakNet protocol ==<br />
<br />
The source code for the RakNet Library can be found [https://github.com/OculusVR/RakNet here].<br />
<br />
Other implementations exist, such as [https://github.com/jython234/JRakLibPlus JRakLibPlus] and [https://github.com/PocketMine/RakLib RakLib].<br />
<br />
=== Connected Ping ===<br />
<br />
{| class="wikitable"<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Notes<br />
|-<br />
| 0x00<br />
| Time<br />
| long<br />
| <br />
|}<br />
<br />
=== Unconnected Ping ===<br />
{| class="wikitable"<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Notes<br />
|-<br />
|rowspan="2"| 0x01, 0x02<br />
| Time<br />
| long<br />
| <br />
|-<br />
| GUID<br />
| long<br />
| <br />
|}<br />
<br />
<code>0x02</code> is only replied to if there are open connections to the server.<br />
<br />
=== Connected Pong ===<br />
{| class="wikitable"<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Notes<br />
|-<br />
|rowspan="2"| 0x03<br />
| Ping Time<br />
| long<br />
| <br />
|-<br />
| Pong Time<br />
| long<br />
| <br />
|}<br />
<br />
=== Offline Connection Request 1 ===<br />
{| class="wikitable"<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Notes<br />
|-<br />
|rowspan="3"| 0x05<br />
| Magic<br />
| MAGIC<br />
| <br />
|-<br />
| Protocol version<br />
| byte<br />
| Currently 7<br />
|-<br />
| MTU<br />
| mtu-46 zero bytes<br />
| The MTU sent in the response appears to be somewhere around the size of this padding + 46 (28 udp overhead, 1 packet id, 16 magic, 1 protocol version)<br />
|}<br />
<br />
The client sends these to the target server with ever decreasing MTU until the server responds. This is used to discover the MTU size for the connection. If the RakNet protocol does not match your own, respond with the Incompatible protocol packet<br />
<br />
=== Offline Connection Response 1 ===<br />
{| class="wikitable"<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Notes<br />
|-<br />
|rowspan="3"| 0x06<br />
| Magic<br />
| MAGIC<br />
| <br />
|-<br />
| Server GUID<br />
| long<br />
| <br />
|-<br />
| MTU<br />
| short<br />
| see Offline Connection Request 1<br />
|}<br />
<br />
=== Offline Connection Request 2 ===<br />
{| class="wikitable"<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Notes<br />
|-<br />
|rowspan="4"| 0x07<br />
| Magic<br />
| MAGIC<br />
| <br />
|-<br />
| Server Address<br />
| address<br />
| <br />
|-<br />
| MTU<br />
| short<br />
| <br />
|-<br />
| Client GUID<br />
| long<br />
| <br />
|}<br />
<br />
=== Offline Connection Response 2 ===<br />
{| class="wikitable"<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Notes<br />
|-<br />
|rowspan="5"| 0x08<br />
| Magic<br />
| MAGIC<br />
| <br />
|-<br />
| Server GUID<br />
| long<br />
| <br />
|-<br />
| Client Address<br />
| address<br />
| <br />
|-<br />
| MTU<br />
| short<br />
| <br />
|-<br />
| Encryption enabled?<br />
| byte<br />
| 0 for disabled.<br />
|}<br />
<br />
=== Online Connection Request ===<br />
{| class="wikitable"<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Notes<br />
|-<br />
|rowspan="2"| 0x09<br />
| GUID<br />
| long<br />
| <br />
|-<br />
| Time<br />
| long<br />
| <br />
|}<br />
<br />
=== Online Connection Request Accepted ===<br />
{| class="wikitable"<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Notes<br />
|-<br />
|rowspan="5"| 0x10<br />
| Client address<br />
| address<br />
| <br />
|-<br />
| System index<br />
| short<br />
| Unknown what this does. 0 works as a value.<br />
|-<br />
| Internal IDs<br />
| 10x address<br />
| Unknown what these do. 255.255.255.255:19132 for all of them seems to work, any other address will probably work as well.<br />
|-<br />
| Request time<br />
| long<br />
| <br />
|-<br />
| Time<br />
| long<br />
| <br />
|}<br />
<br />
=== Incompatible protocol ===<br />
{| class="wikitable"<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Notes<br />
|-<br />
|rowspan="4"| 0x19<br />
| Protocol<br />
| byte<br />
| <br />
|-<br />
| Magic<br />
| MAGIC<br />
| <br />
|-<br />
| Server GUID<br />
| long<br />
| <br />
|-<br />
|}<br />
<br />
=== Unconnected Ping ===<br />
{| class="wikitable"<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Notes<br />
|-<br />
|rowspan="2"| 0x01, 0x02<br />
| Time<br />
| long<br />
| <br />
|-<br />
| GUID<br />
| long<br />
| <br />
|}<br />
<br />
=== Frame Set Packet ===<br />
{| class="wikitable"<br />
! Packet ID<br />
!colspan="3"| Field Name<br />
! Field Type<br />
! Notes<br />
|-<br />
|rowspan="11"| 0x80..0x8d<br />
|colspan="3"| Frame Set index<br />
| uint24le<br />
| <br />
|-<br />
|rowspan="10"| Frames<br />
|colspan="2"| Flags<br />
| byte<br />
| Top 3 bits are reliability type, fourth bit is 1 when the frame is fragmented and part of a compound.<br />
|-<br />
|colspan="2"| Length IN BITS<br />
| short<br />
| Length of the body in bits.<br />
|-<br />
|colspan="2"| Reliable frame index<br />
| uint24le<br />
| only if reliable<br />
|-<br />
|colspan="2"| Sequenced frame index<br />
| uint24le<br />
| only if sequenced<br />
|-<br />
|rowspan="2"| Order<br />
| Ordered frame index<br />
| uint24le<br />
|rowspan="2"| only if ordered<br />
|-<br />
| Order channel<br />
| byte<br />
|-<br />
|rowspan="3"| Fragment<br />
| Compound size<br />
| int<br />
|rowspan="3"| only if fragmented<br />
|-<br />
| Compound ID<br />
| short<br />
|-<br />
| Index<br />
| int<br />
|-<br />
| Body<br />
| ceil(length/8) bytes<br />
|}<br />
<br />
The reliability types are as follows:<br />
<br />
{| class="wikitable"<br />
! style="text-align: center; font-weight: bold;" | ID<br />
! style="font-weight: bold;" | Name<br />
! style="text-align: center; font-weight: bold;" | Reliable<br />
! style="text-align: center; font-weight: bold;" | Ordered<br />
! style="text-align: center; font-weight: bold;" | Sequenced<br />
|-<br />
| style="text-align: center;" | 0<br />
| unreliable<br />
| style="text-align: center;" | <br />
| style="text-align: center;" | <br />
| style="text-align: center;" | <br />
|-<br />
| style="text-align: center;" | 1<br />
| unreliable sequenced<br />
| style="text-align: center;" | <br />
| style="text-align: center;" | x<br />
| style="text-align: center;" | x<br />
|-<br />
| style="text-align: center;" | 2<br />
| reliable<br />
| style="text-align: center;" | x<br />
| style="text-align: center;" | <br />
| style="text-align: center;" | <br />
|-<br />
| style="text-align: center;" | 3<br />
| reliable ordered<br />
| style="text-align: center;" | x<br />
| style="text-align: center;" | x<br />
| style="text-align: center;" | <br />
|-<br />
| style="text-align: center;" | 4<br />
| reliable sequenced<br />
| style="text-align: center;" | x<br />
| style="text-align: center;" | x<br />
| style="text-align: center;" | x<br />
|-<br />
| style="text-align: center;" | 5<br />
| unreliable (+ ACK receipt)<br />
| style="text-align: center;" | <br />
| style="text-align: center;" | <br />
| style="text-align: center;" | <br />
|-<br />
| style="text-align: center;" | 6<br />
| reliable (+ ACK receipt)<br />
| style="text-align: center;" | x<br />
| style="text-align: center;" | <br />
| style="text-align: center;" | <br />
|-<br />
| style="text-align: center;" | 7<br />
| reliable ordered (+ ACK receipt)<br />
| style="text-align: center;" | x<br />
| style="text-align: center;" | x<br />
| style="text-align: center;" | <br />
|}<br />
<br />
Sequenced implies ordered.<br />
<br />
=== Game Packet ===<br />
{| class="wikitable"<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Notes<br />
|-<br />
| 0x8e<br />
| Body<br />
| bytes<br />
| Single packet of the GAME protocol.<br />
|}<br />
<br />
=== NACK ===<br />
{| class="wikitable"<br />
! style="font-weight: bold;" | Packet ID<br />
! colspan="3" style="font-weight: bold;" | Field Name<br />
! style="font-weight: bold;" | Field Type<br />
! style="font-weight: bold;" | Notes<br />
|-<br />
| 0xa0<br />
| colspan="3" | Record count<br />
| short<br />
| <br />
|-<br />
| <br />
| rowspan="4" | Record<br />
| colspan="2" | Is Range?<br />
| byte<br />
| 0 for range, 1 for no range<br />
|-<br />
| <br />
| No Range<br />
| Index<br />
| uint24le<br />
| <br />
|-<br />
| <br />
| rowspan="2" | Range<br />
| Start Index<br />
| uint24le<br />
| <br />
|-<br />
| <br />
| End Index<br />
| uint24le<br />
| <br />
|}<br />
<br />
=== ACK ===<br />
{| class="wikitable"<br />
! style="font-weight: bold;" | Packet ID<br />
! colspan="3" style="font-weight: bold;" | Field Name<br />
! style="font-weight: bold;" | Field Type<br />
! style="font-weight: bold;" | Notes<br />
|-<br />
| 0xc0<br />
| colspan="3" | Record count<br />
| short<br />
| <br />
|-<br />
| <br />
| rowspan="4" | Record<br />
| colspan="2" | Is Range?<br />
| byte<br />
| 0 for range, 1 for no range<br />
|-<br />
| <br />
| No Range<br />
| Index<br />
| uint24le<br />
| <br />
|-<br />
| <br />
| rowspan="2" | Range<br />
| Start Index<br />
| uint24le<br />
| <br />
|-<br />
| <br />
| End Index<br />
| uint24le<br />
| <br />
|}<br />
<br />
== RakNet Reliability ==<br />
<br />
RakNet reliability and ordering is handled on multiple levels.<br />
<br />
=== Frame set reliability ===<br />
FrameSetPackets carry a unique index. This index may only appear once in a connection (per direction). Getting the same index twice means you have received a duplicate datagram - ignore one.<br />
<br />
Upon receiving a frame set, an ACK packet for that frame set is sent back. Since the frame set index is a sequential counter, you can deduce which frame sets are missing, for which a NACK packet is sent. For every received frame set, RakNet sends at most one NACK and one ACK.<br />
<br />
Frame sets consist of frames. Internally, raknet uses a "resend queue" (priority heap / priority queue) of frames it needs to send. This queue is ordered by targeted send time. Whenever possible, raknet takes the top few sendable frames from this resend queue and combines them into a frame set smaller than the MTU. It then moves the ''reliable'' frames further down the queue by setting their resend time to a bunch of milliseconds in the future. ''unreliable'' frames are discarded after being first sent.<br />
<br />
When an ACK is received, all frames of the container indices in that ACK packet are removed from the resend queue because they arrived safely on the client and don't need a resend.<br />
<br />
When a NACK is received, all frames of the container indices in that NACK packet are moved to the top of the resend queue by setting their targeted resend time to the present or past.<br />
<br />
To send a frame, raknet simply adds it to the resend queue with the present as the targeted send time. It is then intermixed with normal resends and other frames for the next frame set packet.<br />
<br />
=== Fragmentation ===<br />
<br />
Some packets (notably chunks) are larger than the MTU. These are split up into a ''compound''. You need to consider the frame and frame set overhead when fragmenting frames. A fragmented frame contains the ''compound ID'' (reusable when compound is complete), ''compound size'' (in fragments) and ''index'' (0 up to compound size exclusive). All fragments of a compound share the same order and sequencing information, if any. All fragmented frames are also reliable.<br />
<br />
=== Order and Sequencing ===<br />
<br />
Some frames are ordered or sequenced. For order and sequencing, there exist ''order channels''. These act independently. Since all sequenced reliability types are also ordered, an order channel is present for every ordered or sequenced frame.<br />
<br />
''Ordered'' means that frames with higher order indices are ''always'' handled after frames with lower order indices. Higher order index frames are withheld until their lower peers arrive and it's their turn.<br />
<br />
''Sequenced'' means that frames with lower sequence indices are ''never'' handled after frames with higher sequence indices. Lower sequence index frames are ''discarded'' if their higher index frames have already been handled.<br />
<br />
Sequenced frames also include an order index. It is unknown how the order index influences handling, and this should be researched at some point.<br />
<br />
== Game Protocol ==<br />
<br />
The game protocol is described here: https://confluence.yawk.at/display/PEPROTOCOL and an autoatically generated version for 0.15 is also available in from MiNET at https://github.com/NiclasOlofsson/MiNET/blob/master/src/MiNET/MiNET/Net/MCPE%20Protocol%20Documentation.md<br />
<br />
== References ==<br />
<br />
* RakNet datagram and message header information: http://jenkinssoftware.com/raknet/manual/systemoverview.html<br />
* Packets can be found in the [http://dragonet.org Dragonet] server code https://github.com/DragonetMC/Dragonet/tree/master/src/main/java/org/dragonet/net/packet<br />
* There is also an automatically generated specification of many of the packages can be found in the MiNET server code https://github.com/NiclasOlofsson/MiNET/blob/master/src/MiNET/MiNET/Net/MCPE%20Protocol%20Documentation.md <br />
* The MiNET wiki also contain development notes around some functionality https://github.com/NiclasOlofsson/MiNET/wiki These will be migrated to this wiki in due time.<br />
* https://confluence.yawk.at/display/PEPROTOCOL</div>
Gurun
https://wiki.vg/index.php?title=Pocket_Edition_Protocol_Documentation&diff=7956
Pocket Edition Protocol Documentation
2016-06-06T15:32:38Z
<p>Gurun: Update protocol links.</p>
<hr />
<div>This is the (unofficial) protocol documentation for {{Minecraft Wiki|Minecraft Pocket Edition}}. The protocol currently uses [[Wikipedia:UDP|UDP]] for communication, different from PC (which uses [[Wikipedia:TCP|TCP]]). The usual UDP issues are still here (lost packets, wrong order, etc.), but the protocol solves a few of those problems using special packet encapsulation, based on TCP. The Minecraft: PE client uses [http://www.raknet.com/ RakNet] as its networking library. Even though it uses RakNet, you can still write software without the library.<br />
<br />
Currently, the game's default port is 19132. It is recommended to use this when possible because processes such as server discovering will not work otherwise.<br />
<br />
== Data Types ==<br />
Minecraft packets use different data types to communicate with each other. The documented ones are listed below:<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" |<br />
! class="col1" | Size<br />
! class="col2" | Range<br />
! class="col3" | Notes<br />
|- class="row1"<br />
! class="col0 centeralign" | byte<br />
| class="col1 centeralign" | 1<br />
| class="col2" | -128 to 127<br />
| class="col3" | <code></code><br />
|- class="row2"<br />
! class="col0 centeralign" | short<br />
| class="col1 centeralign" | 2<br />
| class="col2" | -32768 to 32767<br />
| class="col3" | <code></code><br />
|- class="row3"<br />
! class="col0 centeralign" | uint24le<br />
| class="col1 centeralign" | 3<br />
| class="col2" | 0 to 16777216<br />
| class="col3" | Little-Endian 24-bit unsigned integer. Commonly used by RakNet for counters.<br />
|- class="row4"<br />
! class="col0 centeralign" | int<br />
| class="col1 centeralign" | 4<br />
| class="col2" | -2147483648 to 2147483647<br />
| class="col3" | <code></code><br />
|- class="row5"<br />
! class="col0 centeralign" | long<br />
| class="col1 centeralign" | 8<br />
| class="col2" | <br />
| class="col3" | <code></code><br />
|- class="row6"<br />
! class="col0 centeralign" | MAGIC<br />
| class="col1 centeralign" | 16<br />
| class="col2" | <code>0x00ffff00fefefefefdfdfdfd12345678</code><br />
| class="col3" | always those hex bytes, corresponding to RakNet's default OFFLINE_MESSAGE_DATA_ID<br />
|- class="row7"<br />
! class="col0 centeralign" | string<br />
| class="col1 centeralign" | unsigned short + string<br />
| class="col2" | N/A<br />
| class="col3" | Prefixed by a short containing the length of the string in characters. It appears that only the following ASCII characters can be displayed: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~<br />
|- class="row8"<br />
! class="col0 centeralign" | address<br />
| class="col1 centeralign" | 7<br />
| class="col2" | N/A<br />
| class="col3" | IP Address and port. First byte is the version (0x04), then come the address bytes and finally an unsigned short for the port.<br />
|-<br />
! NBT<br />
| N/A<br />
| N/A<br />
| NBT data in PE is always ''little-endian''. This includes short, int, long, float, double tags and the length headers for arrays, strings and lists.<br />
|-<br />
! Item Stack<br />
| N/A<br />
| N/A<br />
| First short is the item ID. If this is not 0, then follows the item count ubyte. If this is also not 0, then follows the item data short and a ''little-endian'' short denoting the length of the following NBT data, or 0 for no NBT. Then follows an NBT tag described above of that length.<br />
|-<br />
! UUID<br />
| 16<br />
| 00000000-0000-0000-0000-000000000000 <br />
to ffffffff-ffff-ffff-ffff-ffffffffffff<br />
| <br />
|-<br />
! Position<br />
| 12<br />
| N/A<br />
| Three consecutive floats for x, y and z respectively.<br />
|-<br />
! Block Position<br />
| 12<br />
| N/A<br />
| Three consecutive ints for x, y and z respectively.<br />
|}<br />
<br />
== Packet format ==<br />
All packets in Minecraft: Pocket Edition start with their ID, which is an unsigned byte. If you are using a language which does not support unsigned types such as Java, you can do (byte & 0xFF) to get the unsigned version.<br />
<br />
== RakNet protocol ==<br />
<br />
The source code for the RakNet Library can be found [https://github.com/OculusVR/RakNet here].<br />
<br />
Other implementations exist, such as [https://github.com/jython234/JRakLibPlus JRakLibPlus] and [https://github.com/PocketMine/RakLib RakLib].<br />
<br />
=== Connected Ping ===<br />
<br />
{| class="wikitable"<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Notes<br />
|-<br />
| 0x00<br />
| Time<br />
| long<br />
| <br />
|}<br />
<br />
=== Unconnected Ping ===<br />
{| class="wikitable"<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Notes<br />
|-<br />
|rowspan="2"| 0x01, 0x02<br />
| Time<br />
| long<br />
| <br />
|-<br />
| GUID<br />
| long<br />
| <br />
|}<br />
<br />
<code>0x02</code> is only replied to if there are open connections to the server.<br />
<br />
=== Connected Pong ===<br />
{| class="wikitable"<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Notes<br />
|-<br />
|rowspan="2"| 0x03<br />
| Ping Time<br />
| long<br />
| <br />
|-<br />
| Pong Time<br />
| long<br />
| <br />
|}<br />
<br />
=== Offline Connection Request 1 ===<br />
{| class="wikitable"<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Notes<br />
|-<br />
|rowspan="3"| 0x05<br />
| Magic<br />
| MAGIC<br />
| <br />
|-<br />
| Protocol version<br />
| byte<br />
| Currently 7<br />
|-<br />
| MTU<br />
| mtu-46 zero bytes<br />
| The MTU sent in the response appears to be somewhere around the size of this padding + 46 (28 udp overhead, 1 packet id, 16 magic, 1 protocol version)<br />
|}<br />
<br />
The client sends these to the target server with ever decreasing MTU until the server responds. This is used to discover the MTU size for the connection.<br />
<br />
=== Offline Connection Response 1 ===<br />
{| class="wikitable"<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Notes<br />
|-<br />
|rowspan="3"| 0x06<br />
| Magic<br />
| MAGIC<br />
| <br />
|-<br />
| Server GUID<br />
| long<br />
| <br />
|-<br />
| MTU<br />
| short<br />
| see Offline Connection Request 1<br />
|}<br />
<br />
=== Offline Connection Request 2 ===<br />
{| class="wikitable"<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Notes<br />
|-<br />
|rowspan="4"| 0x07<br />
| Magic<br />
| MAGIC<br />
| <br />
|-<br />
| Server Address<br />
| address<br />
| <br />
|-<br />
| MTU<br />
| short<br />
| <br />
|-<br />
| Client GUID<br />
| long<br />
| <br />
|}<br />
<br />
=== Offline Connection Response 2 ===<br />
{| class="wikitable"<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Notes<br />
|-<br />
|rowspan="5"| 0x08<br />
| Magic<br />
| MAGIC<br />
| <br />
|-<br />
| Server GUID<br />
| long<br />
| <br />
|-<br />
| Client Address<br />
| address<br />
| <br />
|-<br />
| MTU<br />
| short<br />
| <br />
|-<br />
| Encryption enabled?<br />
| byte<br />
| 0 for disabled.<br />
|}<br />
<br />
=== Online Connection Request ===<br />
{| class="wikitable"<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Notes<br />
|-<br />
|rowspan="2"| 0x09<br />
| GUID<br />
| long<br />
| <br />
|-<br />
| Time<br />
| long<br />
| <br />
|}<br />
<br />
=== Online Connection Request Accepted ===<br />
{| class="wikitable"<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Notes<br />
|-<br />
|rowspan="5"| 0x10<br />
| Client address<br />
| address<br />
| <br />
|-<br />
| System index<br />
| short<br />
| Unknown what this does. 0 works as a value.<br />
|-<br />
| Internal IDs<br />
| 10x address<br />
| Unknown what these do. 255.255.255.255:19132 for all of them seems to work, any other address will probably work as well.<br />
|-<br />
| Request time<br />
| long<br />
| <br />
|-<br />
| Time<br />
| long<br />
| <br />
|}<br />
<br />
=== Unconnected Pong ===<br />
{| class="wikitable"<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Notes<br />
|-<br />
|rowspan="4"| 0x1c<br />
| Time<br />
| long<br />
| <br />
|-<br />
| Server GUID<br />
| long<br />
| <br />
|-<br />
| Magic<br />
| MAGIC<br />
| <br />
|-<br />
| Server info<br />
| string<br />
| <code>MCPE;##Name##;##Protocol Version##;##Client Version##;##Online player count##;##Max player count##;##Server GUID##;</code>. Protocol version is currently (0.14.1) 46. Client version can be left empty or be something like '0.14.1'. Server GUID is a 64-bit unsigned integer, 0 works as a value. Example: <code>MCPE;kitty;46;0.14.1;1;5;18446744071609048444;</code><br />
|}<br />
<br />
=== Frame Set Packet ===<br />
{| class="wikitable"<br />
! Packet ID<br />
!colspan="3"| Field Name<br />
! Field Type<br />
! Notes<br />
|-<br />
|rowspan="11"| 0x80..0x8d<br />
|colspan="3"| Frame Set index<br />
| uint24le<br />
| <br />
|-<br />
|rowspan="10"| Frames<br />
|colspan="2"| Flags<br />
| byte<br />
| Top 3 bits are reliability type, fourth bit is 1 when the frame is fragmented and part of a compound.<br />
|-<br />
|colspan="2"| Length IN BITS<br />
| short<br />
| Length of the body in bits.<br />
|-<br />
|colspan="2"| Reliable frame index<br />
| uint24le<br />
| only if reliable<br />
|-<br />
|colspan="2"| Sequenced frame index<br />
| uint24le<br />
| only if sequenced<br />
|-<br />
|rowspan="2"| Order<br />
| Ordered frame index<br />
| uint24le<br />
|rowspan="2"| only if ordered<br />
|-<br />
| Order channel<br />
| byte<br />
|-<br />
|rowspan="3"| Fragment<br />
| Compound size<br />
| int<br />
|rowspan="3"| only if fragmented<br />
|-<br />
| Compound ID<br />
| short<br />
|-<br />
| Index<br />
| int<br />
|-<br />
| Body<br />
| ceil(length/8) bytes<br />
|}<br />
<br />
The reliability types are as follows:<br />
<br />
{| class="wikitable"<br />
! style="text-align: center; font-weight: bold;" | ID<br />
! style="font-weight: bold;" | Name<br />
! style="text-align: center; font-weight: bold;" | Reliable<br />
! style="text-align: center; font-weight: bold;" | Ordered<br />
! style="text-align: center; font-weight: bold;" | Sequenced<br />
|-<br />
| style="text-align: center;" | 0<br />
| unreliable<br />
| style="text-align: center;" | <br />
| style="text-align: center;" | <br />
| style="text-align: center;" | <br />
|-<br />
| style="text-align: center;" | 1<br />
| unreliable sequenced<br />
| style="text-align: center;" | <br />
| style="text-align: center;" | x<br />
| style="text-align: center;" | x<br />
|-<br />
| style="text-align: center;" | 2<br />
| reliable<br />
| style="text-align: center;" | x<br />
| style="text-align: center;" | <br />
| style="text-align: center;" | <br />
|-<br />
| style="text-align: center;" | 3<br />
| reliable ordered<br />
| style="text-align: center;" | x<br />
| style="text-align: center;" | x<br />
| style="text-align: center;" | <br />
|-<br />
| style="text-align: center;" | 4<br />
| reliable sequenced<br />
| style="text-align: center;" | x<br />
| style="text-align: center;" | x<br />
| style="text-align: center;" | x<br />
|-<br />
| style="text-align: center;" | 5<br />
| unreliable (+ ACK receipt)<br />
| style="text-align: center;" | <br />
| style="text-align: center;" | <br />
| style="text-align: center;" | <br />
|-<br />
| style="text-align: center;" | 6<br />
| reliable (+ ACK receipt)<br />
| style="text-align: center;" | x<br />
| style="text-align: center;" | <br />
| style="text-align: center;" | <br />
|-<br />
| style="text-align: center;" | 7<br />
| reliable ordered (+ ACK receipt)<br />
| style="text-align: center;" | x<br />
| style="text-align: center;" | x<br />
| style="text-align: center;" | <br />
|}<br />
<br />
Sequenced implies ordered.<br />
<br />
=== Game Packet ===<br />
{| class="wikitable"<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Notes<br />
|-<br />
| 0x8e<br />
| Body<br />
| bytes<br />
| Single packet of the GAME protocol.<br />
|}<br />
<br />
=== NACK ===<br />
{| class="wikitable"<br />
! style="font-weight: bold;" | Packet ID<br />
! colspan="3" style="font-weight: bold;" | Field Name<br />
! style="font-weight: bold;" | Field Type<br />
! style="font-weight: bold;" | Notes<br />
|-<br />
| 0xa0<br />
| colspan="3" | Record count<br />
| short<br />
| <br />
|-<br />
| <br />
| rowspan="4" | Record<br />
| colspan="2" | Is Range?<br />
| byte<br />
| 0 for range, 1 for no range<br />
|-<br />
| <br />
| No Range<br />
| Index<br />
| uint24le<br />
| <br />
|-<br />
| <br />
| rowspan="2" | Range<br />
| Start Index<br />
| uint24le<br />
| <br />
|-<br />
| <br />
| End Index<br />
| uint24le<br />
| <br />
|}<br />
<br />
=== ACK ===<br />
{| class="wikitable"<br />
! style="font-weight: bold;" | Packet ID<br />
! colspan="3" style="font-weight: bold;" | Field Name<br />
! style="font-weight: bold;" | Field Type<br />
! style="font-weight: bold;" | Notes<br />
|-<br />
| 0xc0<br />
| colspan="3" | Record count<br />
| short<br />
| <br />
|-<br />
| <br />
| rowspan="4" | Record<br />
| colspan="2" | Is Range?<br />
| byte<br />
| 0 for range, 1 for no range<br />
|-<br />
| <br />
| No Range<br />
| Index<br />
| uint24le<br />
| <br />
|-<br />
| <br />
| rowspan="2" | Range<br />
| Start Index<br />
| uint24le<br />
| <br />
|-<br />
| <br />
| End Index<br />
| uint24le<br />
| <br />
|}<br />
<br />
== RakNet Reliability ==<br />
<br />
RakNet reliability and ordering is handled on multiple levels.<br />
<br />
=== Frame set reliability ===<br />
FrameSetPackets carry a unique index. This index may only appear once in a connection (per direction). Getting the same index twice means you have received a duplicate datagram - ignore one.<br />
<br />
Upon receiving a frame set, an ACK packet for that frame set is sent back. Since the frame set index is a sequential counter, you can deduce which frame sets are missing, for which a NACK packet is sent. For every received frame set, RakNet sends at most one NACK and one ACK.<br />
<br />
Frame sets consist of frames. Internally, raknet uses a "resend queue" (priority heap / priority queue) of frames it needs to send. This queue is ordered by targeted send time. Whenever possible, raknet takes the top few sendable frames from this resend queue and combines them into a frame set smaller than the MTU. It then moves the ''reliable'' frames further down the queue by setting their resend time to a bunch of milliseconds in the future. ''unreliable'' frames are discarded after being first sent.<br />
<br />
When an ACK is received, all frames of the container indices in that ACK packet are removed from the resend queue because they arrived safely on the client and don't need a resend.<br />
<br />
When a NACK is received, all frames of the container indices in that NACK packet are moved to the top of the resend queue by setting their targeted resend time to the present or past.<br />
<br />
To send a frame, raknet simply adds it to the resend queue with the present as the targeted send time. It is then intermixed with normal resends and other frames for the next frame set packet.<br />
<br />
=== Fragmentation ===<br />
<br />
Some packets (notably chunks) are larger than the MTU. These are split up into a ''compound''. You need to consider the frame and frame set overhead when fragmenting frames. A fragmented frame contains the ''compound ID'' (reusable when compound is complete), ''compound size'' (in fragments) and ''index'' (0 up to compound size exclusive). All fragments of a compound share the same order and sequencing information, if any. All fragmented frames are also reliable.<br />
<br />
=== Order and Sequencing ===<br />
<br />
Some frames are ordered or sequenced. For order and sequencing, there exist ''order channels''. These act independently. Since all sequenced reliability types are also ordered, an order channel is present for every ordered or sequenced frame.<br />
<br />
''Ordered'' means that frames with higher order indices are ''always'' handled after frames with lower order indices. Higher order index frames are withheld until their lower peers arrive and it's their turn.<br />
<br />
''Sequenced'' means that frames with lower sequence indices are ''never'' handled after frames with higher sequence indices. Lower sequence index frames are ''discarded'' if their higher index frames have already been handled.<br />
<br />
Sequenced frames also include an order index. It is unknown how the order index influences handling, and this should be researched at some point.<br />
<br />
== Game Protocol ==<br />
<br />
The game protocol is described here: https://confluence.yawk.at/display/PEPROTOCOL and an autoatically generated version for 0.15 is also available in from MiNET at https://github.com/NiclasOlofsson/MiNET/blob/realms/src/MiNET/MiNET/Net/MCPE%20Protocol%20Documentation.md<br />
<br />
== References ==<br />
<br />
* RakNet datagram and message header information: http://jenkinssoftware.com/raknet/manual/systemoverview.html<br />
* Packets can be found in the [http://dragonet.org Dragonet] server code https://github.com/DragonetMC/Dragonet/tree/master/src/main/java/org/dragonet/net/packet<br />
* There is also an automatically generated specification of many of the packages can be found in the MiNET server code https://github.com/NiclasOlofsson/MiNET/blob/master/src/MiNET/MiNET/Net/MCPE%20Protocol%20Documentation.md * The MiNET wiki also contain development notes around some functionality https://github.com/NiclasOlofsson/MiNET/wiki These will be migrated to this wiki in due time.<br />
* https://confluence.yawk.at/display/PEPROTOCOL</div>
Gurun
https://wiki.vg/index.php?title=Bedrock_Edition_Program_List&diff=6508
Bedrock Edition Program List
2015-03-11T22:39:57Z
<p>Gurun: MiNET not so "basic" anymore.</p>
<hr />
<div>List of Minecraft: PE Clients, Servers, Libraries, Wrappers and Tools.<br />
<br />
{| class="wikitable sortable" style="width: auto; text-align: center;"<br />
|-style="background:#eee"<br />
!Name<br />
!class="unsortable"|Description<br />
!Type<br />
!Author(s)<br />
!Language<br />
!License<br />
!Features<br />
!Platform<br />
!Last Version Supported<br />
|-<br />
! [http://www.pocketmine.net/ PocketMine-MP]<br />
| Server with Plugin API, Multiworlds and more<br />
| Server<br />
| [https://twitter.com/PocketMine PocketMine Team]<br />
| {{PHP}}<br />
| {{LGPL}}<br />
| Alpha_1.4.1 beta1<br />
| {{windows}}{{linux}}{{mac}}<br />
| {{yes|v0.10.4 alpha}}<br />
|-<br />
! [https://github.com/zhuowei/MCPELauncher BlockLauncher]<br />
| BlockLauncher is a custom Minecraft PE launcher that wraps around Minecraft PE and provides texture pack and patch loading support.<br />
| Launcher<br />
| [https://twitter.com/zhuowei Zhuowei Zhang]<br />
| {{Java}}<br />
| Unknown<br />
| Texture Pack support, Mod PE Scripts & Custom Skins<br />
| {{Android}}<br />
| {{yes|0.10.5 alpha}}<br />
|-<br />
! [https://github.com/brandon15811/Minecraft-PE-Proxy Minecraft-PE-Proxy]<br />
| UDP proxy for MCPE Servers, allowing joining Online Servers from your local network. Dumps packets<br />
| Proxy<br />
| [https://github.com/brandon15811 brandon15811]<br />
| Node.js<br />
| Unknown<br />
| Allows seeing sent/received packets through a web interface<br />
| {{windows}}{{linux}}{{mac}}<br />
| {{No}}<br />
|-<br />
! [https://github.com/PocketMine/PocketBurger PocketBurger]<br />
| Extracts information from the Minecraft: PE binary about the protocol + more. Compatible with Burger, Hamburglar and BurgerVitrine<br />
| Utility<br />
| [https://twitter.com/shoghicp shoghicp]<br />
| {{PHP}}<br />
| No restrictions<br />
| Generates JSON output, compatible with Burger<br />
| {{windows}}{{linux}}{{mac}}<br />
| {{No|v0.8.1 alpha}}<br />
|-<br />
! [https://github.com/NiclasOlofsson/MiNET/ MiNET]<br />
| MCPE server <strike>with basic functionality.</strike><br />
| Server<br />
| [https://github.com/NiclasOlofsson Niclas Olofsson]<br>[https://github.com/kennyvv kennyvv]<br />
| {{CSHARP}}<br />
| {{MPL}}<br />
| Stable but alpha functionality<br />
| {{windows}}{{linux}}{{mac}}<br />
| {{Yes|alpha}}<br />
|-<br />
|}<br />
<br />
[[Category:Pocket Minecraft]]</div>
Gurun
https://wiki.vg/index.php?title=Pocket_Edition_Protocol_Documentation&diff=6434
Pocket Edition Protocol Documentation
2015-02-02T00:27:05Z
<p>Gurun: Added link to automatically generated spec back (why the hell someone removed that i don't know). Also added link to MiNET wiki with further notes on the protocol.</p>
<hr />
<div>This is the (unofficial) protocol docs for Minecraft: PE. The protocol currently uses UDP for communication, different from PC (TCP). The usual UDP issues are still here (lost packets, wrong order, etc.), but the protocol solves a few of those problems using special packet encapsulation, based on TCP. The Minecraft: PE client uses RakNet for it's networking library. Even though it uses RakNet, you can still write software without the library.<br />
<br />
<br />
== Data Types ==<br />
Minecraft packets use different data types to communicate with each other. The documented ones are listed below:<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" |<br />
! class="col1" | Size<br />
! class="col2" | Range<br />
! class="col3" | Notes<br />
|- class="row1"<br />
! class="col0 centeralign" | byte<br />
| class="col1 centeralign" | 1<br />
| class="col2" | -128 to 127<br />
| class="col3" | <code></code><br />
|- class="row2"<br />
! class="col0 centeralign" | short<br />
| class="col1 centeralign" | 2<br />
| class="col2" | -32768 to 32767<br />
| class="col3" | <code></code><br />
|- class="row3"<br />
! class="col0 centeralign" | Integer<br />
| class="col1 centeralign" | 4<br />
| class="col2" | -2147483648 to 2147483647<br />
| class="col3" | <code></code><br />
|- class="row4"<br />
! class="col0 centeralign" | Long<br />
| class="col1 centeralign" | 8<br />
| class="col2" | <br />
| class="col3" | <code></code><br />
|- class="row5"<br />
! class="col0 centeralign" | MAGIC<br />
| class="col1 centeralign" | 16<br />
| class="col2" | <code>0x00ffff00fefefefefdfdfdfd12345678</code><br />
| class="col3" | always those hex bytes, corresponding to RakNet's default OFFLINE_MESSAGE_DATA_ID<br />
|- class="row6"<br />
! class="col0 centeralign" | string<br />
| class="col1 centeralign" | short + string<br />
| class="col2" | N/A<br />
| class="col3" | Prefixed by a short containing the length of the string in characters. It appears that only the following ASCII characters can be displayed: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~<br />
|}<br />
<br />
== Reference ==<br />
<br />
RakNet datagram and message header information: http://im/raknet/manual/systemoverview.html<br />
<br />
The latest version of the protocol is not fully documented yet, but all of the packets can be found in the [http://dragonet.org Dragonet] server code https://github.com/DragonetMC/Dragonet/tree/master/src/main/java/org/dragonet/net/packet<br />
<br />
There is also an automatically generated specification of many of the packages can be found in the MiNET server code https://github.com/NiclasOlofsson/MiNET/blob/master/src/MiNET/MiNET/Net/MCPE%20Protocol%20Documentation.md<br />
<br />
The MiNET wiki also contain development notes around some functionality https://github.com/NiclasOlofsson/MiNET/wiki These will be migrated to this wiki in due time.</div>
Gurun
https://wiki.vg/index.php?title=Pocket_Edition_Protocol_Documentation&diff=6365
Pocket Edition Protocol Documentation
2015-01-17T20:26:37Z
<p>Gurun: Added link to RakNet datagram and message header information.</p>
<hr />
<div>This is the (unofficial) protocol docs for Minecraft: PE. The protocol currently uses UDP for communication, different from PC (TCP). The usual UDP issues are still here (lost packets, wrong order, etc.), but the protocol solves a few of those problems using special packet encapsulation, based on TCP. The Minecraft: PE client uses RakNet for it's networking library. Even though it uses RakNet, you can still write software without the library.<br />
<br />
<br />
== Data Types ==<br />
Minecraft packets use different data types to communicate with each other. The documented ones are listed below:<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" |<br />
! class="col1" | Size<br />
! class="col2" | Range<br />
! class="col3" | Notes<br />
|- class="row1"<br />
! class="col0 centeralign" | byte<br />
| class="col1 centeralign" | 1<br />
| class="col2" | -128 to 127<br />
| class="col3" | <code></code><br />
|- class="row2"<br />
! class="col0 centeralign" | short<br />
| class="col1 centeralign" | 2<br />
| class="col2" | -32768 to 32767<br />
| class="col3" | <code></code><br />
|- class="row3"<br />
! class="col0 centeralign" | Integer<br />
| class="col1 centeralign" | 4<br />
| class="col2" | -2147483648 to 2147483647<br />
| class="col3" | <code></code><br />
|- class="row4"<br />
! class="col0 centeralign" | Long<br />
| class="col1 centeralign" | 8<br />
| class="col2" | <br />
| class="col3" | <code></code><br />
|- class="row5"<br />
! class="col0 centeralign" | MAGIC<br />
| class="col1 centeralign" | 16<br />
| class="col2" | <code>0x00ffff00fefefefefdfdfdfd12345678</code><br />
| class="col3" | always those hex bytes, corresponding to RakNet's default OFFLINE_MESSAGE_DATA_ID<br />
|- class="row6"<br />
! class="col0 centeralign" | string<br />
| class="col1 centeralign" | short + string<br />
| class="col2" | N/A<br />
| class="col3" | Prefixed by a short containing the length of the string in characters. It appears that only the following ASCII characters can be displayed: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~<br />
|}<br />
<br />
== Reference ==<br />
<br />
RakNet datagram and message header information: http://www.raknet.net/raknet/manual/systemoverview.html<br />
<br />
The latest version of the protocol is not fully documented yet, but an automatically generated specification of many of the packages can be found in the MiNET server code https://github.com/NiclasOlofsson/MiNET/blob/master/src/MiNET/MiNET/Net/MCPE%20Protocol%20Documentation.md</div>
Gurun
https://wiki.vg/index.php?title=Template:MPL&diff=6340
Template:MPL
2015-01-10T23:17:28Z
<p>Gurun: Created page with "[https://www.mozilla.org/MPL/ MPL]"</p>
<hr />
<div>[https://www.mozilla.org/MPL/ MPL]</div>
Gurun
https://wiki.vg/index.php?title=Template:CSHARP&diff=6339
Template:CSHARP
2015-01-10T23:14:55Z
<p>Gurun: Created page with "C#"</p>
<hr />
<div>C#</div>
Gurun
https://wiki.vg/index.php?title=Bedrock_Edition_Program_List&diff=6338
Bedrock Edition Program List
2015-01-10T23:14:44Z
<p>Gurun: </p>
<hr />
<div>List of Minecraft: PE Clients, Servers, Libraries, Wrappers and Tools.<br />
<br />
{| class="wikitable sortable" style="width: auto; text-align: center;"<br />
|-style="background:#eee"<br />
!Name<br />
!class="unsortable"|Description<br />
!Type<br />
!Author(s)<br />
!Language<br />
!License<br />
!Features<br />
!Platform<br />
!Last Version Supported<br />
|-<br />
! [http://www.pocketmine.net/ PocketMine-MP]<br />
| Server with Plugin API, Multiworlds and more<br />
| Server<br />
| [https://twitter.com/PocketMine PocketMine Team]<br />
| {{PHP}}<br />
| {{LGPL}}<br />
| Alpha_1.4 beta6<br />
| {{windows}}{{linux}}{{mac}}<br />
| {{yes|v0.9.5 alpha}}<br />
|-<br />
! [https://github.com/brandon15811/Minecraft-PE-Proxy Minecraft-PE-Proxy]<br />
| UDP proxy for MCPE Servers, allowing joining Online Servers from your local network. Dumps packets<br />
| Proxy<br />
| [https://github.com/brandon15811 brandon15811]<br />
| Node.js<br />
| Unknown<br />
| Allows seeing sent/received packets through a web interface<br />
| {{windows}}{{linux}}{{mac}}<br />
| {{yes}}<br />
|-<br />
! [https://github.com/PocketMine/PocketBurger PocketBurger]<br />
| Extracts information from the Minecraft: PE binary about the protocol + more. Compatible with Burger, Hamburglar and BurgerVitrine<br />
| Utility<br />
| [https://twitter.com/shoghicp shoghicp]<br />
| {{PHP}}<br />
| No restrictions<br />
| Generates JSON output, compatible with Burger<br />
| {{windows}}{{linux}}{{mac}}<br />
| {{yes|v0.8.1 alpha}}<br />
|-<br />
! [https://github.com/NiclasOlofsson/MiNET/ MiNET]<br />
| MCPE server with basic functionality.<br />
| Server<br />
| [https://github.com/NiclasOlofsson Niclas Olofsson]<br />
| {{CSHARP}}<br />
| {{MPL}}<br />
| Stable but alpha functionality<br />
| {{windows}}<br />
| {{yes|alpha}}<br />
|-<br />
|}<br />
<br />
[[Category:Pocket Minecraft]]</div>
Gurun
https://wiki.vg/index.php?title=Pocket_Edition_Protocol_Documentation&diff=6337
Pocket Edition Protocol Documentation
2015-01-10T23:07:00Z
<p>Gurun: </p>
<hr />
<div>This is the (unofficial) protocol docs for Minecraft: PE. The protocol currently uses UDP for communication, different from PC (TCP). The usual UDP issues are still here (lost packets, wrong order, etc.), but the protocol solves a few of those problems using special packet encapsulation, based on TCP. The Minecraft: PE client uses RakNet for it's networking library. Even though it uses RakNet, you can still write software without the library.<br />
<br />
<br />
== Data Types ==<br />
Minecraft packets use different data types to communicate with each other. The documented ones are listed below:<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" |<br />
! class="col1" | Size<br />
! class="col2" | Range<br />
! class="col3" | Notes<br />
|- class="row1"<br />
! class="col0 centeralign" | byte<br />
| class="col1 centeralign" | 1<br />
| class="col2" | -128 to 127<br />
| class="col3" | <code></code><br />
|- class="row2"<br />
! class="col0 centeralign" | short<br />
| class="col1 centeralign" | 2<br />
| class="col2" | -32768 to 32767<br />
| class="col3" | <code></code><br />
|- class="row3"<br />
! class="col0 centeralign" | Integer<br />
| class="col1 centeralign" | 4<br />
| class="col2" | -2147483648 to 2147483647<br />
| class="col3" | <code></code><br />
|- class="row4"<br />
! class="col0 centeralign" | Long<br />
| class="col1 centeralign" | 8<br />
| class="col2" | <br />
| class="col3" | <code></code><br />
|- class="row5"<br />
! class="col0 centeralign" | MAGIC<br />
| class="col1 centeralign" | 16<br />
| class="col2" | <code>0x00ffff00fefefefefdfdfdfd12345678</code><br />
| class="col3" | always those hex bytes, corresponding to RakNet's default OFFLINE_MESSAGE_DATA_ID<br />
|- class="row6"<br />
! class="col0 centeralign" | string<br />
| class="col1 centeralign" | short + string<br />
| class="col2" | N/A<br />
| class="col3" | Prefixed by a short containing the length of the string in characters. It appears that only the following ASCII characters can be displayed: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~<br />
|}<br />
<br />
<br />
== Reference ==<br />
<br />
The latest version of the protocol is not fully documented yet, but an automatically generated specification of many of the packages can be found in the MiNET server code https://github.com/NiclasOlofsson/MiNET/blob/master/src/MiNET/MiNET/Net/MCPE%20Protocol%20Documentation.md</div>
Gurun
https://wiki.vg/index.php?title=Pocket_Minecraft_Protocol&diff=6131
Pocket Minecraft Protocol
2014-09-26T13:50:03Z
<p>Gurun: </p>
<hr />
<div>Unlike the Minecraft protocol, this protocol uses UDP with (so far observed, at least) one message per packet. This makes the protocol easier to work with when it comes to packet serialization, and might offer latency improvements, but will inevitably have the usual UDP issues (packets lost, truncated, duplicated, out-of-order, etc.).<br />
<br />
'''As of 0.9.0, clients appear to search for servers on only port 19132.'''<br />
<br />
Clients don't pick any specific port to listen on.<br />
<br />
<br />
Please note that even where packet field names are written in this page, these are still largely hypothetical and could well be incorrect guesses. Some packets are fixed to the RakNet protocol, and will be marked as "RakNet Packet", which means that these packets will not change on future versions.<br />
<br />
It has been determined that PM uses RakNet for its networking library, [http://www.jenkinssoftware.com/raknet/manual/networkmessages.html some documentation that seems relevant].<br />
<br />
<br />
The [[Pocket_Editon_Login|login sequence]] is not covered by this page.<br />
<br />
<br />
== Terminology ==<br />
<br />
;PM:Pocket Minecraft (aka Minecraft PE or Minecraft Pocket Edition)<br />
<br />
== Types ==<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" |<br />
! class="col1" | Size<br />
! class="col2" | Range<br />
! class="col3" | Notes<br />
|- class="row1"<br />
! class="col0 centeralign" | byte<br />
| class="col1 centeralign" | 1<br />
| class="col2" | -128 to 127<br />
| class="col3" | Signed, two's complement<br />
|- class="row2"<br />
! class="col0 centeralign" | short<br />
| class="col1 centeralign" | 2<br />
| class="col2" | -32768 to 32767<br />
| class="col3" | Signed, two's complement<br />
|- class="row3"<br />
! class="col0 centeralign" | int32<br />
| class="col1 centeralign" | 4<br />
| class="col2" | -2147483648 to 2147483647<br />
| class="col3" | Signed, two's complement<br />
|- class="row4"<br />
! class="col0 centeralign" | int64<br />
| class="col1 centeralign" | 8<br />
| class="col2" | <br />
| class="col3" | Maybe a double?<br />
|- class="row5"<br />
! class="col0 centeralign" | MAGIC<br />
| class="col1 centeralign" | 16<br />
| class="col2" | <code>0x00ffff00fefefefefdfdfdfd12345678</code><br />
| class="col3" | always those hex bytes, corresponding to RakNet's default OFFLINE_MESSAGE_DATA_ID<br />
|- class="row6"<br />
! class="col0 centeralign" | string<br />
| class="col1 centeralign" | = 1<br />
| class="col2" | N/A<br />
| class="col3" | Prefixed by a short containing the length of the string in characters. It appears that only the following ASCII characters can be displayed: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~<br />
|}<br />
<br />
== Packets ==<br />
<br />
All packets start with a single byte that identifies the packet type, the rest of the packet follows it.<br />
<br />
{{anchor|0x01}}<br />
=== ID_CONNECTED_PING_OPEN_CONNECTIONS (0x01) ===<br />
<br />
''Client to Broadcast''<br />
<br />
<br />
'''RakNet Packet'''<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Packet ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="2" | 0x01<br />
| class="col1 centeralign" | Ping ID<br />
| class="col2 centeralign" | int64<br />
| class="col3 centeralign" | <code>0x00000000003c6d0d</code><br />
| class="col4" | Time since start in Milliseconds<br />
|- class="row2"<br />
| class="col0 centeralign" | MAGIC<br />
| class="col1 centeralign" | MAGIC<br />
| class="col2 centeralign" | <br />
| class="col3" |<br />
|- class="row3"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 25 Bytes<br />
|}<br />
<br />
Clients start out by sending this packet to the IP broadcast address on port 19132 repeatedly (approx once per second) when joining a server was chosen on the main screen, and stops when the user selects a server (or leaves the screen). The ping ID from the client increases over time, and appears to be the number of milliseconds since the client program was started (might be used to measure server response latency).<br />
<br />
{{anchor|0x02}}<br />
=== ID_UNCONNECTED_PING_OPEN_CONNECTIONS (0x02) ===<br />
<br />
''Client to Broadcast''<br />
<br />
'''NOTE: THIS PACKET APPEARS TO BE UNUSED. Use a 0x01 packet instead'''<br />
'''RakNet Packet'''<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Packet ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="2" | 0x02<br />
| class="col1 centeralign" | Ping ID<br />
| class="col2 centeralign" | int64<br />
| class="col3 centeralign" | <code>0x00000000003c6d0d</code><br />
| class="col4" | Time since start in Milliseconds<br />
|- class="row2"<br />
| class="col0 centeralign" | MAGIC<br />
| class="col1 centeralign" | MAGIC<br />
| class="col2 centeralign" | <br />
| class="col3" |<br />
|- class="row3"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 25 Bytes<br />
|}<br />
<br />
Same as [[#0x01|ID_CONNECTED_PING_OPEN_CONNECTIONS (0x01)]], but with the Packet ID changed.<br />
<br />
{{anchor|0x05}}<br />
<br />
=== ID_OPEN_CONNECTION_REQUEST_1 (0x05) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
'''RakNet Packet'''<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Packet ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="3" | 0x05<br />
| class="col1 centeralign" | MAGIC<br />
| class="col2 centeralign" | MAGIC<br />
| class="col3 centeralign" | <br />
| class="col4" | <br />
|- class="row2"<br />
| class="col0 centeralign" | RakNet Protocol Version<br />
| class="col1 centeralign" | byte<br />
| class="col2 centeralign" | <code>5</code><br />
| class="col3" | Check the Data Packet section for the current version<br />
|- class="row2"<br />
| class="col0 centeralign" | Null Payload<br />
| class="col1 centeralign" | many 0x00 bytes<br />
| class="col2 centeralign" | <code>0x00 * 1447</code><br />
| class="col3" | MTU (Maximum Transport Unit)<br />
|- class="row4"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 18 Bytes + length of Null Payload<br />
|}<br />
If the version is different than yours, reply with a <br />
[[#0x1A|ID_INCOMPATIBLE_PROTOCOL_VERSION (0x1A)]]<br />
<br />
Sent from the client after the player taps on the server in the world list The client will repeatedly send this with reducing sizes until it successfully receives a reply. Observed behaviour is that the client will send packets ~0.5s apart in the following way, until it gets a 0x06 response packet, or reaches the end of these:<br />
* 4 packets of Null Payload length of 1447<br />
* 4 packets of Null Payload length of 1155<br />
* 5 packets of Null Payload length of 531<br />
If the server doesnt't reply the client, the client will display a "Connect Error" window<br />
<br />
<br />
{{anchor|0x06}}<br />
<br />
=== ID_OPEN_CONNECTION_REPLY_1 (0x06) ===<br />
<br />
''Server to Client''<br />
<br />
<br />
'''RakNet Packet'''<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Packet ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0x06<br />
| class="col1 centeralign" | MAGIC<br />
| class="col2 centeralign" | MAGIC<br />
| class="col3 centeralign" | <br />
| class="col4" | <br />
|- class="row2"<br />
| class="col0 centeralign" | Server ID<br />
| class="col1 centeralign" | int64<br />
| class="col2 centeralign" | <code>0x00000000372cdc9e</code><br />
| class="col3" | This value seems to be constant for an installation of PM, or differs between the demo and full version.<br />
|- class="row3"<br />
| class="col0 centeralign" | Server Security<br />
| class="col1 centeralign" | byte<br />
| class="col2 centeralign" | <code>0</code><br />
| class="col3" | Always 0<br />
|- class="row4"<br />
| class="col0 centeralign" | MTU Size<br />
| class="col1 centeralign" | short<br />
| class="col2 centeralign" | <code>1447</code><br />
| class="col3" | length of 0x05. Used to determine packet loss and max UDP packet size (MTU)<br />
|- class="row5"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 28 Bytes<br />
|}<br />
<br />
Sent from server after it receives packet 0x05.<br />
<br />
<br />
{{anchor|0x07}}<br />
<br />
=== ID_OPEN_CONNECTION_REQUEST_2 (0x07) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
'''RakNet Packet'''<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Packet ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="5" | 0x07<br />
| class="col1 centeralign" | MAGIC<br />
| class="col2 centeralign" | MAGIC<br />
| class="col3 centeralign" | <br />
| class="col4" | <br />
|- class="row2"<br />
| class="col0 centeralign" | Security + Cookie<br />
| class="col1 centeralign" | 1 + 4 bytes<br />
| class="col2 centeralign" | <code>0x043f57fefd</code><br />
| class="col3" | Unused, constant value<br />
|- class="row3"<br />
| class="col0 centeralign" | Server UDP Port<br />
| class="col1 centeralign" | short<br />
| class="col2 centeralign" | <code>19132</code><br />
| class="col3" | <br />
|- class="row4"<br />
| class="col0 centeralign" | MTU Size<br />
| class="col1 centeralign" | short<br />
| class="col2 centeralign" | <code>1464</code><br />
| class="col3" | <br />
|- class="row5"<br />
| class="col0 centeralign" | Client ID<br />
| class="col1 centeralign" | int64<br />
| class="col2 centeralign" | <code>0x00000000372cdc9e</code><br />
| class="col3" | The Client / Server ID will be the same for a given device<br />
|- class="row6"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 34 Bytes<br />
|}<br />
<br />
Sent from client in response to packet 0x06.<br />
<br />
<br />
{{anchor|0x08}}<br />
=== ID_OPEN_CONNECTION_REPLY_2 (0x08) ===<br />
<br />
''Server to Client''<br />
<br />
<br />
'''RakNet Packet'''<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Packet ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="5" | 0x08<br />
| class="col1 centeralign" | MAGIC<br />
| class="col2 centeralign" | MAGIC<br />
| class="col3 centeralign" | <br />
| class="col4" | <br />
|- class="row2"<br />
| class="col0 centeralign" | Server ID<br />
| class="col1 centeralign" | int64<br />
| class="col2 centeralign" | <code>0x00000000372cdc9e</code><br />
| class="col3" |<br />
|- class="row3"<br />
| class="col0 centeralign" | Client UDP Port<br />
| class="col1 centeralign" | short<br />
| class="col2 centeralign" | <code>46946</code><br />
| class="col3" | <br />
|- class="row4"<br />
| class="col0 centeralign" | MTU Size<br />
| class="col1 centeralign" | short<br />
| class="col2 centeralign" | <code>1464</code><br />
| class="col3" |<br />
|- class="row5"<br />
| class="col0 centeralign" | Security<br />
| class="col1 centeralign" | byte<br />
| class="col2 centeralign" | <code>0</code><br />
| class="col3" | Always 0<br />
|- class="row6"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 30 Bytes<br />
|}<br />
<br />
Sent from server in response to packet 0x07.<br />
<br />
<br />
{{anchor|0x1A}}<br />
=== ID_INCOMPATIBLE_PROTOCOL_VERSION (0x1A) ===<br />
<br />
''Server to Client''<br />
<br />
<br />
'''RakNet Packet'''<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Packet ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="3" | 0x1A<br />
| class="col1 centeralign" | Protocol Version<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>5</code><br />
| class="col4" | <br />
|- class="row2"<br />
| class="col0 centeralign" | MAGIC<br />
| class="col1 centeralign" | MAGIC<br />
| class="col2 centeralign" | <br />
| class="col3" |<br />
|- class="row2"<br />
| class="col0 centeralign" | Server ID<br />
| class="col1 centeralign" | int64<br />
| class="col2 centeralign" | <code>0x00000000372cdc9e</code><br />
| class="col3" | <br />
|- class="row3"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 26 Bytes<br />
|}<br />
<br />
Sent when the server doesn't support the RakNet protocol specified in 0x05.<br />
<br />
{{anchor|0x1C}}<br />
<br />
=== ID_UNCONNECTED_PING_OPEN_CONNECTIONS (0x1C) ===<br />
<br />
''Server to Client''<br />
<br />
<br />
'''RakNet Packet'''<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Packet ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0x1C<br />
| class="col1 centeralign" | Ping ID<br />
| class="col2 centeralign" | int64<br />
| class="col3 centeralign" | <code>0x00000000003c6d0d</code><br />
| class="col4" | Time since start in Milliseconds<br />
|- class="row2"<br />
| class="col0 centeralign" | Server ID<br />
| class="col1 centeralign" | int64<br />
| class="col2 centeralign" | <code>0x00000000372cdc9e</code><br />
| class="col3" |<br />
|- class="row3"<br />
| class="col0 centeralign" | MAGIC<br />
| class="col1 centeralign" | MAGIC<br />
| class="col2 centeralign" | <br />
| class="col3" |<br />
|-class="row4"<br />
| class="col0 centeralign" | Identifier<br />
| class="col1 centeralign" | string<br />
| class="col2 centeralign" | MCCPP;Demo;Steve<br />
| class="col3" |<br />
|- class="row6"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 35 Bytes + Server name length<br />
|}<br />
<br />
Server sends this packet in response to a 0x01 packet.<br />
If the Server is invisible, this packet will be sent without username<br />
<br />
In order for the server to show up in the world list, the server name must have "MCCPP;MINECON;" in front of it.<br />
<br />
{{anchor|0x1D}}<br />
<br />
=== ID_ADVERTISE_SYSTEM (0x1D) ===<br />
<br />
''Server to Client''<br />
<br />
<br />
'''RakNet Packet'''<br />
<br />
'''THIS PACKET IS UNUSED, Use a 0x1c packet instead.'''<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Packet ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0x1D<br />
| class="col1 centeralign" | Ping ID<br />
| class="col2 centeralign" | int64<br />
| class="col3 centeralign" | <code>0x00000000003c6d0d</code><br />
| class="col4" | Time since start in Milliseconds<br />
|- class="row2"<br />
| class="col0 centeralign" | Server ID<br />
| class="col1 centeralign" | int64<br />
| class="col2 centeralign" | <code>0x00000000372cdc9e</code><br />
| class="col3" |<br />
|- class="row4"<br />
| class="col0 centeralign" | MAGIC<br />
| class="col1 centeralign" | MAGIC<br />
| class="col2 centeralign" | <br />
| class="col3" |<br />
|- class="row2"<br />
| class="col0 centeralign" | Data<br />
| class="col1 centeralign" | string<br />
| class="col2 centeralign" | <code>MCCPP;Demo;Steve</code><br />
| class="col3" | Used to send the username (MCCPP;Demo; + username)<br />
|- class="row3"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 35 Bytes + length of string<br />
|}<br />
<br />
Same as [[#0x1C|ID_UNCONNECTED_PING_OPEN_CONNECTIONS (0x1C)]], but with the Packet ID changed. Depends of the version to send a 0x1D or a 0x1C<br />
<br />
=== Custom Packet (0x80-0x8F) ===<br />
<br />
''Two-Way''<br />
<br />
'''This packet is part of the real Minecraft PE implementation. The structure can change anytime.'''<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Packet ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="2" | 0x80-0x8F<br />
| class="col1 centeralign" | Count<br />
| class="col2 centeralign" | 3 bytes<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" | Increments once every packet. <br />
|- class="row2"<br />
| class="col2 centeralign" | Data payload<br />
| class="col1 centeralign" |<br />
| class="col2 centeralign" | <code>0x40009000000009...</code><br />
| class="col3" | Uses [[#Packet_Encapsulation|Packet Encapsulation format]]<br />
<br />
|- class="row3"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 4 Bytes + payload<br />
|}<br />
<br />
The receiver will use the Packet number in the 0xC0 packet and send it back.<br />
<br />
{{anchor|0xA0}}<br />
<br />
=== NACK (0xA0) ===<br />
<br />
''Two-Way''<br />
<br />
'''This packet is part of the real Minecraft PE implementation. The structure can change anytime.'''<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Packet ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0xN0<br />
| class="col1 centeralign" | Unknown<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>1</code><br />
| class="col4" | <br />
|- class="row2"<br />
| class="col1 centeralign" | Additional Packet<br />
| class="col2 centeralign" | boolean<br />
| class="col3 centeralign" | <code>''true''</code><br />
| class="col4" | ''true'' when there is only one packet received<br />
|- class="row3"<br />
| class="col1 centeralign" | Packet Number<br />
| class="col2 centeralign" | 3 bytes<br />
| class="col3 centeralign" | <code>0x000000</code><br />
| class="col4" | Packet to resend<br />
|- class="row4"<br />
| class="col1 centeralign" | Packet Number #2<br />
| class="col2 centeralign" | 3 bytes<br />
| class="col3 centeralign" | <code>0x000004</code><br />
| class="col4" | Aditional packet to resend (only when ''false'')<br />
|- class="row5"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 7 or 10 Bytes<br />
|}<br />
<br />
Send these when a packet was lost, or reply to this resending the lost packet.<br />
<br />
=== ACK (0xC0) ===<br />
<br />
''Two-Way''<br />
<br />
'''This packet is part of the real Minecraft PE implementation. The structure can change anytime.'''<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Packet ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0xC0<br />
| class="col1 centeralign" | Unknown<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>1</code><br />
| class="col4" | <br />
|- class="row2"<br />
| class="col1 centeralign" | Additional Packet<br />
| class="col2 centeralign" | boolean<br />
| class="col3 centeralign" | <code>''true''</code><br />
| class="col4" | ''true'' when there is only one packet received<br />
|- class="row3"<br />
| class="col1 centeralign" | Packet Number<br />
| class="col2 centeralign" | 3 bytes<br />
| class="col3 centeralign" | <code>0x000000</code><br />
| class="col4" | Received packet number from field Count in 0x84 and 0x8C<br />
|- class="row4"<br />
| class="col1 centeralign" | Packet Number #2<br />
| class="col2 centeralign" | 3 bytes<br />
| class="col3 centeralign" | <code>0x000004</code><br />
| class="col4" | Last received packet number (only when ''false'')<br />
|- class="row5"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 7 or 10 Bytes<br />
|}<br />
<br />
Sent after a 0x8X. It's used to ACK recieval of packets.<br />
The second packet number is optional and only there when bool is false.<br />
<br />
<br />
{{anchor|Packet_Encapsulation}}<br />
<br />
== Packet Encapsulation format ==<br />
The payload in 0x80-0x8F packets is encoded using different schemes.<br />
To decode them, you've to use the Encapsulation ID to check wich type you should use.<br />
The Encapsulation ID is the first byte of the payload.<br />
<br />
Multiple Data Encapsulation packets could be present in one packet. If you want to send data, use 0x00<br />
<br />
<br />
'''Calculate length in bytes:'''<br />
real length = length / 8<br />
<br />
<br />
=== 0x00 ===<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Encapsulation ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="2" | 0x00<br />
| class="col1 centeralign" | length<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>0x0090</code><br />
| class="col4" | Length of Packet in bits<br />
|- class="row2"<br />
| class="col2 centeralign" | Packet<br />
| class="col1 centeralign" | Data Packet<br />
| class="col2 centeralign" | <code>0x09d92145...</code><br />
| class="col3" | <br />
|- class="row3"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 3 Bytes + Packet Data length<br />
|}<br />
<br />
=== 0x40 ===<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Encapsulation ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="3" | 0x40<br />
| class="col1 centeralign" | length<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>0x0090</code><br />
| class="col4" | Length of Packet in bits<br />
|- class="row2"<br />
| class="col2 centeralign" | Count<br />
| class="col1 centeralign" | 3 bytes<br />
| class="col2 centeralign" | <code>0x000000</code><br />
| class="col3" | Unknown use<br />
|- class="row3"<br />
| class="col2 centeralign" | Packet<br />
| class="col1 centeralign" | Data Packet<br />
| class="col2 centeralign" | <code>0x09d92145...</code><br />
| class="col3" | <br />
|- class="row4"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 6 Bytes + Packet Data length<br />
|}<br />
<br />
=== 0x60 ===<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Encapsulation ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0x60<br />
| class="col1 centeralign" | length<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>0x0090</code><br />
| class="col4" | Length of Packet in bits<br />
|- class="row2"<br />
| class="col2 centeralign" | Count<br />
| class="col1 centeralign" | 3 bytes<br />
| class="col2 centeralign" | <code>0x000000</code><br />
| class="col3" | Unknown use<br />
|- class="row3"<br />
| class="col2 centeralign" | Unknown<br />
| class="col1 centeralign" | 4 bytes<br />
| class="col2 centeralign" | <code>0x00000000</code><br />
| class="col3" | Only sent on first iteration<br />
|- class="row4"<br />
| class="col2 centeralign" | Packet<br />
| class="col1 centeralign" | Data Packet<br />
| class="col2 centeralign" | <code>0x09d92145...</code><br />
| class="col3" |<br />
|- class="row6"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 12 Bytes + Packet Data length<br />
|}<br />
<br />
<br />
== Data Packets ==<br />
<br />
This information has been generated using [https://github.com/PocketMine/PocketBurger PocketBurger], then edited manually.<br />
<br />
'''Minecraft: Pocket Edition v0.7.3, protocol #11'''<br />
<br />
'''RakNet Protocol version #5'''<br />
=== LoginPacket (0x82) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="5" | 0x82<br />
| Username<br />
| string8<br />
| <br />
|-<br />
| Protocol #1<br />
| int<br />
| <br />
|-<br />
| Protocol #2<br />
| int<br />
| <br />
|-<br />
| ClientID<br />
| int<br />
| <br />
|-<br />
| Realms Data<br />
| string8<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== LoginStatusPacket (0x83) ===<br />
<br />
''Server to Client''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="1" | 0x83<br />
| Status<br />
| int<br />
| <br />
|-<br />
<br />
|}<br />
<br />
The three type of status are:<br />
<br />
0: Everything is good.<br />
<br />
1: If the server is outdated.<br />
<br />
2. If the game is outdated. <br />
<br />
If everything is good you need to send the StartGamePacket<br />
<br />
=== ReadyPacket (0x84) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="1" | 0x84<br />
| bits[8] Status<br />
| byte<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== MessagePacket (0x85) ===<br />
<br />
''Two-Way''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="1" | 0x85<br />
| Message<br />
| string8<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== SetTimePacket (0x86) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="1" | 0x86<br />
| Time<br />
| int<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== StartGamePacket (0x87) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="7" | 0x87<br />
| level seed<br />
| int<br />
| <br />
|-<br />
| Unknown<br />
| int<br />
| <br />
|-<br />
| Gamemode<br />
| int<br />
| <br />
|-<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| X<br />
| float<br />
| <br />
|-<br />
| Y<br />
| float<br />
| <br />
|-<br />
| Z<br />
| float<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== AddMobPacket (0x88) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="8" | 0x88<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| Type<br />
| int<br />
| <br />
|-<br />
| X<br />
| float<br />
| <br />
|-<br />
| Y<br />
| float<br />
| <br />
|-<br />
| Z<br />
| float<br />
| <br />
|-<br />
| yaw<br />
| byte<br />
| <br />
|-<br />
| pitch<br />
| byte<br />
| <br />
|-<br />
| Metadata<br />
| byte[]<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== AddPlayerPacket (0x89) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="11" | 0x89<br />
| (unsigned) Client ID<br />
| long<br />
| <br />
|-<br />
| Username<br />
| string8<br />
| <br />
|-<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| X<br />
| float<br />
| <br />
|-<br />
| Y<br />
| float<br />
| <br />
|-<br />
| Z<br />
| float<br />
| <br />
|-<br />
| Yaw<br />
| byte<br />
| <br />
|-<br />
| Pitch<br />
| byte<br />
| <br />
|-<br />
| Unknown<br />
| short<br />
| <br />
|-<br />
| Unknown<br />
| short<br />
| <br />
|-<br />
| Metadata<br />
| byte[]<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== RemovePlayerPacket (0x8a) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="2" | 0x8a<br />
| entity ID<br />
| int<br />
| <br />
|-<br />
| (unsigned) Client ID<br />
| long<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== AddEntityPacket (0x8c) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="9" | 0x8c<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| Type<br />
| byte<br />
| <br />
|-<br />
| X<br />
| float<br />
| <br />
|-<br />
| Y<br />
| float<br />
| <br />
|-<br />
| Z<br />
| float<br />
| <br />
|-<br />
| Did?<br />
| int<br />
| If this int > 0 you can send the next parameter<br />
|-<br />
| SpeedX<br />
| short<br />
| <br />
|-<br />
| SpeedY<br />
| short<br />
| <br />
|-<br />
| SpeedZ<br />
| short<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== RemoveEntityPacket (0x8d) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="1" | 0x8d<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== AddItemEntityPacket (0x8e) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="10" | 0x8e<br />
| Enity ID<br />
| int<br />
| <br />
|-<br />
| Block<br />
| short<br />
| <br />
|-<br />
| Stack<br />
| byte<br />
| <br />
|-<br />
| Meta<br />
| short<br />
| <br />
|-<br />
| X<br />
| float<br />
| <br />
|-<br />
| Y<br />
| float<br />
| <br />
|-<br />
| Z<br />
| float<br />
| <br />
|-<br />
| Yaw<br />
| byte<br />
| <br />
|-<br />
| Pitch<br />
| byte<br />
| <br />
|-<br />
| Roll<br />
| byte<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== TakeItemEntityPacket (0x8f) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="2" | 0x8f<br />
| Target<br />
| int<br />
| <br />
|-<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== MoveEntityPacket (0x90) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="4" | 0x90<br />
| Entity ID<br />
| int<br />
|<br />
|-<br />
| X<br />
| float<br />
|<br />
|-<br />
| Y<br />
| float<br />
|<br />
|-<br />
| Z<br />
| float<br />
|<br />
|-<br />
<br />
|}<br />
<br />
=== MoveEntityPacket_PosRot (0x93) ===<br />
<br />
''None''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="6" | 0x93<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| X<br />
| float<br />
| <br />
|-<br />
| Y<br />
| float<br />
| <br />
|-<br />
| Z<br />
| float<br />
| <br />
|-<br />
| Yaw<br />
| float<br />
| <br />
|-<br />
| Pitch<br />
| float<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== MovePlayerPacket (0x94) ===<br />
<br />
''Two-Way''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="6" | 0x94<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| X<br />
| float<br />
| <br />
|-<br />
| Y<br />
| float<br />
| <br />
|-<br />
| Z<br />
| float<br />
| <br />
|-<br />
| Yaw<br />
| float<br />
| <br />
|-<br />
| Pitch<br />
| float<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== PlaceBlockPacket (0x95) ===<br />
<br />
''Two-Way''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="7" | 0x95<br />
| Entity iD<br />
| int<br />
| <br />
|-<br />
| X<br />
| int<br />
| <br />
|-<br />
| Z<br />
| int<br />
| <br />
|-<br />
| Y<br />
| byte<br />
| <br />
|-<br />
| Block<br />
| byte<br />
| <br />
|-<br />
| Meta<br />
| byte<br />
| <br />
|-<br />
| Face<br />
| byte<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== RemoveBlockPacket (0x96) ===<br />
<br />
''Server to Client''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="4" | 0x96<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| X<br />
| int<br />
| <br />
|-<br />
| Z<br />
| int<br />
| <br />
|-<br />
| Y<br />
| byte<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== UpdateBlockPacket (0x97) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="5" | 0x97<br />
| Entiy ID<br />
| int<br />
| <br />
|-<br />
| X<br />
| int<br />
| <br />
|-<br />
| Z<br />
| int<br />
| <br />
|-<br />
| Y<br />
| byte<br />
| <br />
|-<br />
| Block<br />
| byte<br />
| <br />
|-<br />
| Meta<br />
| byte<br />
|<br />
|-<br />
<br />
|}<br />
<br />
=== AddPaintingPacket (0x98) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="6" | 0x98<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| X<br />
| int<br />
| <br />
|-<br />
| Y<br />
| int<br />
| <br />
|-<br />
| Z<br />
| int<br />
| <br />
|-<br />
| Direction<br />
| int<br />
| <br />
|-<br />
| Title<br />
| string8<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== ExplodePacket (0x99) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="8" | 0x99<br />
| X<br />
| float<br />
| <br />
|-<br />
| Y<br />
| float<br />
| <br />
|-<br />
| Z<br />
| float<br />
| <br />
|-<br />
| Radius<br />
| float<br />
| <br />
|-<br />
| Count<br />
| int<br />
| <br />
|-<br />
| Records<br />
| byte<br />
| <br />
|-<br />
| Counts?<br />
| byte<br />
| <br />
|-<br />
| Records?<br />
| byte<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== LevelEventPacket (0x9a) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="5" | 0x9a<br />
| Unknown?<br />
| short<br />
| <br />
|-<br />
| Unknown?<br />
| short<br />
| <br />
|-<br />
| Unknown?<br />
| short<br />
| <br />
|-<br />
| Unknown?<br />
| short<br />
| <br />
|-<br />
| Unknown?<br />
| int<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== TileEventPacket (0x9b) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="5" | 0x9b<br />
| X<br />
| int<br />
| <br />
|-<br />
| Y<br />
| int<br />
| <br />
|-<br />
| Z<br />
| int<br />
| <br />
|-<br />
| Case 1<br />
| int<br />
| <br />
|-<br />
| Case 2<br />
| int<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== EntityEventPacket (0x9c) ===<br />
<br />
''Two-Way''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="2" | 0x9c<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| Event<br />
| byte<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== RequestChunkPacket (0x9d) ===<br />
<br />
''Server to Client''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="2" | 0x9d<br />
| X<br />
| int<br />
| <br />
|-<br />
| Z<br />
| int<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== ChunkDataPacket (0x9e) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="5" | 0x9e<br />
| X<br />
| int<br />
| <br />
|-<br />
| Z<br />
| int<br />
| <br />
|-Data?<br />
| byte<br />
| <br />
|-<br />
| Data?<br />
| byte[]<br />
| <br />
|-<br />
| Data?<br />
| byte[]<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== PlayerEquipmentPacket (0x9f) ===<br />
<br />
''Two-Way''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="4" | 0x9f<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| Block<br />
| short<br />
| <br />
|-<br />
| Meta<br />
| short<br />
| <br />
|-<br />
| Slot<br />
| byte<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== PlayerArmorEquipmentPacket (0xa0) ===<br />
<br />
''Two-Way''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="5" | 0xa0<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| Slot 1<br />
| byte<br />
| <br />
|-<br />
| Slot 2<br />
| byte<br />
| <br />
|-<br />
| Slot 3<br />
| byte<br />
| <br />
|-<br />
| Slot 4<br />
| byte<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== InteractPacket (0xa1) ===<br />
<br />
''Two-Way''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="3" | 0xa1<br />
| Action<br />
| byte[]<br />
| <br />
|-<br />
| entity ID<br />
| int<br />
| <br />
|-<br />
| Target<br />
| int<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== UseItemPacket (0xa2) ===<br />
<br />
''Server to Client''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="13" | 0xa2<br />
| X<br />
| int<br />
| <br />
|-<br />
| Y<br />
| int<br />
| <br />
|-<br />
| Z<br />
| int<br />
| <br />
|-<br />
| Face<br />
| int<br />
| <br />
|-<br />
| Block<br />
| byte[]<br />
| <br />
|-<br />
| Meta<br />
| byte<br />
| <br />
|-<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| Fx<br />
| float<br />
| <br />
|-<br />
| Fy<br />
| float<br />
| <br />
|-<br />
| Fz<br />
| float<br />
| <br />
|-<br />
| PosX<br />
| float<br />
| <br />
|-<br />
| PosY<br />
| float<br />
| <br />
|-<br />
| PosZ<br />
| float<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== PlayerActionPacket (0xa3) ===<br />
<br />
''Server to Client''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="6" | 0xa3<br />
| Action<br />
| int<br />
| <br />
|-<br />
| X<br />
| int<br />
| <br />
|-<br />
| Y<br />
| int<br />
| <br />
|-<br />
| Z<br />
| int<br />
| <br />
|-<br />
| Face<br />
| int<br />
| <br />
|-<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== HurtArmorPacket (0xa5) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="1" | 0xa5<br />
| Health<br />
| byte<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== SetEntityDataPacket (0xa6) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="2" | 0xa6<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| Metadata<br />
| byte[]<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== SetEntityMotionPacket (0xa7) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="5" | 0xa7<br />
| Unknown?<br />
| byte<br />
| <br />
|-<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| X<br />
| short<br />
| <br />
|-<br />
| Y<br />
| short<br />
| <br />
|-<br />
| Z<br />
| short<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== SetRidingPacket (0xa8) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="2" | 0xa8<br />
| a<br />
| int<br />
| <br />
|-<br />
| b<br />
| int<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== SetHealthPacket (0xa9) ===<br />
<br />
''Two-Way''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="1" | 0xa9<br />
| Health<br />
| byte<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== SetSpawnPositionPacket (0xaa) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="3" | 0xaa<br />
| X<br />
| int<br />
| <br />
|-<br />
| Z<br />
| int<br />
| <br />
|-<br />
| Y<br />
| byte<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== AnimatePacket (0xab) ===<br />
<br />
''Two-Way''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="2" | 0xab<br />
| Action<br />
| byte<br />
| <br />
|-<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== RespawnPacket (0xac) ===<br />
<br />
''Two-Way''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="4" | 0xac<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| X<br />
| float<br />
| <br />
|-<br />
| Y<br />
| float<br />
| <br />
|-<br />
| Z<br />
| float<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== SendInventoryPacket (0xad) ===<br />
<br />
''None''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="5" | 0xad<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| Windows ID<br />
| byte<br />
| <br />
|-<br />
| Count<br />
| short<br />
| <br />
|-<br />
| Slots<br />
| byte[]<br />
| <br />
|-<br />
| Items<br />
| byte[]<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== DropItemPacket (0xae) ===<br />
<br />
''Server to Client''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="5" | 0xae<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| Unknown?<br />
| byte<br />
| <br />
|-<br />
| Block<br />
| short<br />
| <br />
|-<br />
| Stack<br />
| byte<br />
|<br />
|-<br />
| Meta<br />
| short<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== ContainerOpenPacket (0xaf) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="4" | 0xaf<br />
| Window ID<br />
| byte<br />
| <br />
|-<br />
| Type<br />
| byte<br />
| <br />
|-<br />
| Slot<br />
| byte<br />
| <br />
|-<br />
| Title<br />
| string8<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== ContainerClosePacket (0xb0) ===<br />
<br />
''Two-Way''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="1" | 0xb0<br />
| Window ID<br />
| byte<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== ContainerSetSlotPacket (0xb1) ===<br />
<br />
''Two-Way''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="5" | 0xb1<br />
| Window ID<br />
| byte<br />
| <br />
|-<br />
| Slot<br />
| short<br />
| <br />
|-<br />
| Block<br />
| short<br />
| <br />
|-<br />
| Stack<br />
| byte<br />
| <br />
|-<br />
| Meta<br />
| short<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== ContainerSetDataPacket (0xb2) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="3" | 0xb2<br />
| Window ID<br />
| byte<br />
| <br />
|-<br />
| Property<br />
| short<br />
| <br />
|-<br />
| Value<br />
| short<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== ContainerSetContentPacket (0xb3) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="3" | 0xb3<br />
| Window ID<br />
| byte<br />
| <br />
|-<br />
| Count<br />
| short<br />
| <br />
|-<br />
| Items<br />
| byte[]<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== ContainerAckPacket (0xb4) ===<br />
<br />
''None''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="2" | 0xb4<br />
| Window ID<br />
| byte<br />
| <br />
|-<br />
| Unknown?<br />
| short<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== ChatPacket (0xb5) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="1" | 0xb5<br />
| Message<br />
| string8<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== SignUpdatePacket (0xb6) ===<br />
<br />
''Two-Way''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="4" | 0xb6<br />
| X<br />
| short<br />
| <br />
|-<br />
| Y<br />
| byte<br />
| <br />
|-<br />
| Z<br />
| short<br />
| <br />
|-<br />
| Lines<br />
| string8<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== AdventureSettingsPacket (0xb7) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="1" | 0xb7<br />
| Flags<br />
| byte[]<br />
| <br />
|-<br />
<br />
|}<br />
<br />
<br />
<br />
[[Category:Pocket Minecraft]]</div>
Gurun
https://wiki.vg/index.php?title=Pocket_Minecraft_Protocol&diff=6130
Pocket Minecraft Protocol
2014-09-26T13:44:49Z
<p>Gurun: </p>
<hr />
<div>Unlike the Minecraft protocol, this protocol uses UDP with (so far observed, at least) one message per packet. This makes the protocol easier to work with when it comes to packet serialization, and might offer latency improvements, but will inevitably have the usual UDP issues (packets lost, truncated, duplicated, out-of-order, etc.).<br />
<br />
'''As of 0.9.0, clients appear to search for servers on only port 19132.'''<br />
<br />
Clients don't pick any specific port to listen on.<br />
<br />
<br />
Please note that even where packet field names are written in this page, these are still largely hypothetical and could well be incorrect guesses. Some packets are fixed to the RakNet protocol, and will be marked as "RakNet Packet", which means that these packets will not change on future versions.<br />
<br />
It has been determined that PM uses RakNet for its networking library, [http://www.jenkinssoftware.com/raknet/manual/networkmessages.html some documentation that seems relevant].<br />
<br />
The [[Pocket_Editon_Login]] is documented on elsewhere on the wiki.<br />
<br />
== Terminology ==<br />
<br />
;PM:Pocket Minecraft (aka Minecraft PE or Minecraft Pocket Edition)<br />
<br />
== Types ==<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" |<br />
! class="col1" | Size<br />
! class="col2" | Range<br />
! class="col3" | Notes<br />
|- class="row1"<br />
! class="col0 centeralign" | byte<br />
| class="col1 centeralign" | 1<br />
| class="col2" | -128 to 127<br />
| class="col3" | Signed, two's complement<br />
|- class="row2"<br />
! class="col0 centeralign" | short<br />
| class="col1 centeralign" | 2<br />
| class="col2" | -32768 to 32767<br />
| class="col3" | Signed, two's complement<br />
|- class="row3"<br />
! class="col0 centeralign" | int32<br />
| class="col1 centeralign" | 4<br />
| class="col2" | -2147483648 to 2147483647<br />
| class="col3" | Signed, two's complement<br />
|- class="row4"<br />
! class="col0 centeralign" | int64<br />
| class="col1 centeralign" | 8<br />
| class="col2" | <br />
| class="col3" | Maybe a double?<br />
|- class="row5"<br />
! class="col0 centeralign" | MAGIC<br />
| class="col1 centeralign" | 16<br />
| class="col2" | <code>0x00ffff00fefefefefdfdfdfd12345678</code><br />
| class="col3" | always those hex bytes, corresponding to RakNet's default OFFLINE_MESSAGE_DATA_ID<br />
|- class="row6"<br />
! class="col0 centeralign" | string<br />
| class="col1 centeralign" | = 1<br />
| class="col2" | N/A<br />
| class="col3" | Prefixed by a short containing the length of the string in characters. It appears that only the following ASCII characters can be displayed: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~<br />
|}<br />
<br />
== Packets ==<br />
<br />
All packets start with a single byte that identifies the packet type, the rest of the packet follows it.<br />
<br />
{{anchor|0x01}}<br />
=== ID_CONNECTED_PING_OPEN_CONNECTIONS (0x01) ===<br />
<br />
''Client to Broadcast''<br />
<br />
<br />
'''RakNet Packet'''<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Packet ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="2" | 0x01<br />
| class="col1 centeralign" | Ping ID<br />
| class="col2 centeralign" | int64<br />
| class="col3 centeralign" | <code>0x00000000003c6d0d</code><br />
| class="col4" | Time since start in Milliseconds<br />
|- class="row2"<br />
| class="col0 centeralign" | MAGIC<br />
| class="col1 centeralign" | MAGIC<br />
| class="col2 centeralign" | <br />
| class="col3" |<br />
|- class="row3"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 25 Bytes<br />
|}<br />
<br />
Clients start out by sending this packet to the IP broadcast address on port 19132 repeatedly (approx once per second) when joining a server was chosen on the main screen, and stops when the user selects a server (or leaves the screen). The ping ID from the client increases over time, and appears to be the number of milliseconds since the client program was started (might be used to measure server response latency).<br />
<br />
{{anchor|0x02}}<br />
=== ID_UNCONNECTED_PING_OPEN_CONNECTIONS (0x02) ===<br />
<br />
''Client to Broadcast''<br />
<br />
'''NOTE: THIS PACKET APPEARS TO BE UNUSED. Use a 0x01 packet instead'''<br />
'''RakNet Packet'''<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Packet ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="2" | 0x02<br />
| class="col1 centeralign" | Ping ID<br />
| class="col2 centeralign" | int64<br />
| class="col3 centeralign" | <code>0x00000000003c6d0d</code><br />
| class="col4" | Time since start in Milliseconds<br />
|- class="row2"<br />
| class="col0 centeralign" | MAGIC<br />
| class="col1 centeralign" | MAGIC<br />
| class="col2 centeralign" | <br />
| class="col3" |<br />
|- class="row3"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 25 Bytes<br />
|}<br />
<br />
Same as [[#0x01|ID_CONNECTED_PING_OPEN_CONNECTIONS (0x01)]], but with the Packet ID changed.<br />
<br />
{{anchor|0x05}}<br />
<br />
=== ID_OPEN_CONNECTION_REQUEST_1 (0x05) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
'''RakNet Packet'''<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Packet ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="3" | 0x05<br />
| class="col1 centeralign" | MAGIC<br />
| class="col2 centeralign" | MAGIC<br />
| class="col3 centeralign" | <br />
| class="col4" | <br />
|- class="row2"<br />
| class="col0 centeralign" | RakNet Protocol Version<br />
| class="col1 centeralign" | byte<br />
| class="col2 centeralign" | <code>5</code><br />
| class="col3" | Check the Data Packet section for the current version<br />
|- class="row2"<br />
| class="col0 centeralign" | Null Payload<br />
| class="col1 centeralign" | many 0x00 bytes<br />
| class="col2 centeralign" | <code>0x00 * 1447</code><br />
| class="col3" | MTU (Maximum Transport Unit)<br />
|- class="row4"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 18 Bytes + length of Null Payload<br />
|}<br />
If the version is different than yours, reply with a <br />
[[#0x1A|ID_INCOMPATIBLE_PROTOCOL_VERSION (0x1A)]]<br />
<br />
Sent from the client after the player taps on the server in the world list The client will repeatedly send this with reducing sizes until it successfully receives a reply. Observed behaviour is that the client will send packets ~0.5s apart in the following way, until it gets a 0x06 response packet, or reaches the end of these:<br />
* 4 packets of Null Payload length of 1447<br />
* 4 packets of Null Payload length of 1155<br />
* 5 packets of Null Payload length of 531<br />
If the server doesnt't reply the client, the client will display a "Connect Error" window<br />
<br />
<br />
{{anchor|0x06}}<br />
<br />
=== ID_OPEN_CONNECTION_REPLY_1 (0x06) ===<br />
<br />
''Server to Client''<br />
<br />
<br />
'''RakNet Packet'''<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Packet ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0x06<br />
| class="col1 centeralign" | MAGIC<br />
| class="col2 centeralign" | MAGIC<br />
| class="col3 centeralign" | <br />
| class="col4" | <br />
|- class="row2"<br />
| class="col0 centeralign" | Server ID<br />
| class="col1 centeralign" | int64<br />
| class="col2 centeralign" | <code>0x00000000372cdc9e</code><br />
| class="col3" | This value seems to be constant for an installation of PM, or differs between the demo and full version.<br />
|- class="row3"<br />
| class="col0 centeralign" | Server Security<br />
| class="col1 centeralign" | byte<br />
| class="col2 centeralign" | <code>0</code><br />
| class="col3" | Always 0<br />
|- class="row4"<br />
| class="col0 centeralign" | MTU Size<br />
| class="col1 centeralign" | short<br />
| class="col2 centeralign" | <code>1447</code><br />
| class="col3" | length of 0x05. Used to determine packet loss and max UDP packet size (MTU)<br />
|- class="row5"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 28 Bytes<br />
|}<br />
<br />
Sent from server after it receives packet 0x05.<br />
<br />
<br />
{{anchor|0x07}}<br />
<br />
=== ID_OPEN_CONNECTION_REQUEST_2 (0x07) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
'''RakNet Packet'''<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Packet ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="5" | 0x07<br />
| class="col1 centeralign" | MAGIC<br />
| class="col2 centeralign" | MAGIC<br />
| class="col3 centeralign" | <br />
| class="col4" | <br />
|- class="row2"<br />
| class="col0 centeralign" | Security + Cookie<br />
| class="col1 centeralign" | 1 + 4 bytes<br />
| class="col2 centeralign" | <code>0x043f57fefd</code><br />
| class="col3" | Unused, constant value<br />
|- class="row3"<br />
| class="col0 centeralign" | Server UDP Port<br />
| class="col1 centeralign" | short<br />
| class="col2 centeralign" | <code>19132</code><br />
| class="col3" | <br />
|- class="row4"<br />
| class="col0 centeralign" | MTU Size<br />
| class="col1 centeralign" | short<br />
| class="col2 centeralign" | <code>1464</code><br />
| class="col3" | <br />
|- class="row5"<br />
| class="col0 centeralign" | Client ID<br />
| class="col1 centeralign" | int64<br />
| class="col2 centeralign" | <code>0x00000000372cdc9e</code><br />
| class="col3" | The Client / Server ID will be the same for a given device<br />
|- class="row6"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 34 Bytes<br />
|}<br />
<br />
Sent from client in response to packet 0x06.<br />
<br />
<br />
{{anchor|0x08}}<br />
=== ID_OPEN_CONNECTION_REPLY_2 (0x08) ===<br />
<br />
''Server to Client''<br />
<br />
<br />
'''RakNet Packet'''<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Packet ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="5" | 0x08<br />
| class="col1 centeralign" | MAGIC<br />
| class="col2 centeralign" | MAGIC<br />
| class="col3 centeralign" | <br />
| class="col4" | <br />
|- class="row2"<br />
| class="col0 centeralign" | Server ID<br />
| class="col1 centeralign" | int64<br />
| class="col2 centeralign" | <code>0x00000000372cdc9e</code><br />
| class="col3" |<br />
|- class="row3"<br />
| class="col0 centeralign" | Client UDP Port<br />
| class="col1 centeralign" | short<br />
| class="col2 centeralign" | <code>46946</code><br />
| class="col3" | <br />
|- class="row4"<br />
| class="col0 centeralign" | MTU Size<br />
| class="col1 centeralign" | short<br />
| class="col2 centeralign" | <code>1464</code><br />
| class="col3" |<br />
|- class="row5"<br />
| class="col0 centeralign" | Security<br />
| class="col1 centeralign" | byte<br />
| class="col2 centeralign" | <code>0</code><br />
| class="col3" | Always 0<br />
|- class="row6"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 30 Bytes<br />
|}<br />
<br />
Sent from server in response to packet 0x07.<br />
<br />
<br />
{{anchor|0x1A}}<br />
=== ID_INCOMPATIBLE_PROTOCOL_VERSION (0x1A) ===<br />
<br />
''Server to Client''<br />
<br />
<br />
'''RakNet Packet'''<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Packet ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="3" | 0x1A<br />
| class="col1 centeralign" | Protocol Version<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>5</code><br />
| class="col4" | <br />
|- class="row2"<br />
| class="col0 centeralign" | MAGIC<br />
| class="col1 centeralign" | MAGIC<br />
| class="col2 centeralign" | <br />
| class="col3" |<br />
|- class="row2"<br />
| class="col0 centeralign" | Server ID<br />
| class="col1 centeralign" | int64<br />
| class="col2 centeralign" | <code>0x00000000372cdc9e</code><br />
| class="col3" | <br />
|- class="row3"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 26 Bytes<br />
|}<br />
<br />
Sent when the server doesn't support the RakNet protocol specified in 0x05.<br />
<br />
{{anchor|0x1C}}<br />
<br />
=== ID_UNCONNECTED_PING_OPEN_CONNECTIONS (0x1C) ===<br />
<br />
''Server to Client''<br />
<br />
<br />
'''RakNet Packet'''<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Packet ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0x1C<br />
| class="col1 centeralign" | Ping ID<br />
| class="col2 centeralign" | int64<br />
| class="col3 centeralign" | <code>0x00000000003c6d0d</code><br />
| class="col4" | Time since start in Milliseconds<br />
|- class="row2"<br />
| class="col0 centeralign" | Server ID<br />
| class="col1 centeralign" | int64<br />
| class="col2 centeralign" | <code>0x00000000372cdc9e</code><br />
| class="col3" |<br />
|- class="row3"<br />
| class="col0 centeralign" | MAGIC<br />
| class="col1 centeralign" | MAGIC<br />
| class="col2 centeralign" | <br />
| class="col3" |<br />
|-class="row4"<br />
| class="col0 centeralign" | Identifier<br />
| class="col1 centeralign" | string<br />
| class="col2 centeralign" | MCCPP;Demo;Steve<br />
| class="col3" |<br />
|- class="row6"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 35 Bytes + Server name length<br />
|}<br />
<br />
Server sends this packet in response to a 0x01 packet.<br />
If the Server is invisible, this packet will be sent without username<br />
<br />
In order for the server to show up in the world list, the server name must have "MCCPP;MINECON;" in front of it.<br />
<br />
{{anchor|0x1D}}<br />
<br />
=== ID_ADVERTISE_SYSTEM (0x1D) ===<br />
<br />
''Server to Client''<br />
<br />
<br />
'''RakNet Packet'''<br />
<br />
'''THIS PACKET IS UNUSED, Use a 0x1c packet instead.'''<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Packet ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0x1D<br />
| class="col1 centeralign" | Ping ID<br />
| class="col2 centeralign" | int64<br />
| class="col3 centeralign" | <code>0x00000000003c6d0d</code><br />
| class="col4" | Time since start in Milliseconds<br />
|- class="row2"<br />
| class="col0 centeralign" | Server ID<br />
| class="col1 centeralign" | int64<br />
| class="col2 centeralign" | <code>0x00000000372cdc9e</code><br />
| class="col3" |<br />
|- class="row4"<br />
| class="col0 centeralign" | MAGIC<br />
| class="col1 centeralign" | MAGIC<br />
| class="col2 centeralign" | <br />
| class="col3" |<br />
|- class="row2"<br />
| class="col0 centeralign" | Data<br />
| class="col1 centeralign" | string<br />
| class="col2 centeralign" | <code>MCCPP;Demo;Steve</code><br />
| class="col3" | Used to send the username (MCCPP;Demo; + username)<br />
|- class="row3"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 35 Bytes + length of string<br />
|}<br />
<br />
Same as [[#0x1C|ID_UNCONNECTED_PING_OPEN_CONNECTIONS (0x1C)]], but with the Packet ID changed. Depends of the version to send a 0x1D or a 0x1C<br />
<br />
=== Custom Packet (0x80-0x8F) ===<br />
<br />
''Two-Way''<br />
<br />
'''This packet is part of the real Minecraft PE implementation. The structure can change anytime.'''<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Packet ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="2" | 0x80-0x8F<br />
| class="col1 centeralign" | Count<br />
| class="col2 centeralign" | 3 bytes<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" | Increments once every packet. <br />
|- class="row2"<br />
| class="col2 centeralign" | Data payload<br />
| class="col1 centeralign" |<br />
| class="col2 centeralign" | <code>0x40009000000009...</code><br />
| class="col3" | Uses [[#Packet_Encapsulation|Packet Encapsulation format]]<br />
<br />
|- class="row3"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 4 Bytes + payload<br />
|}<br />
<br />
The receiver will use the Packet number in the 0xC0 packet and send it back.<br />
<br />
{{anchor|0xA0}}<br />
<br />
=== NACK (0xA0) ===<br />
<br />
''Two-Way''<br />
<br />
'''This packet is part of the real Minecraft PE implementation. The structure can change anytime.'''<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Packet ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0xN0<br />
| class="col1 centeralign" | Unknown<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>1</code><br />
| class="col4" | <br />
|- class="row2"<br />
| class="col1 centeralign" | Additional Packet<br />
| class="col2 centeralign" | boolean<br />
| class="col3 centeralign" | <code>''true''</code><br />
| class="col4" | ''true'' when there is only one packet received<br />
|- class="row3"<br />
| class="col1 centeralign" | Packet Number<br />
| class="col2 centeralign" | 3 bytes<br />
| class="col3 centeralign" | <code>0x000000</code><br />
| class="col4" | Packet to resend<br />
|- class="row4"<br />
| class="col1 centeralign" | Packet Number #2<br />
| class="col2 centeralign" | 3 bytes<br />
| class="col3 centeralign" | <code>0x000004</code><br />
| class="col4" | Aditional packet to resend (only when ''false'')<br />
|- class="row5"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 7 or 10 Bytes<br />
|}<br />
<br />
Send these when a packet was lost, or reply to this resending the lost packet.<br />
<br />
=== ACK (0xC0) ===<br />
<br />
''Two-Way''<br />
<br />
'''This packet is part of the real Minecraft PE implementation. The structure can change anytime.'''<br />
<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Packet ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0xC0<br />
| class="col1 centeralign" | Unknown<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>1</code><br />
| class="col4" | <br />
|- class="row2"<br />
| class="col1 centeralign" | Additional Packet<br />
| class="col2 centeralign" | boolean<br />
| class="col3 centeralign" | <code>''true''</code><br />
| class="col4" | ''true'' when there is only one packet received<br />
|- class="row3"<br />
| class="col1 centeralign" | Packet Number<br />
| class="col2 centeralign" | 3 bytes<br />
| class="col3 centeralign" | <code>0x000000</code><br />
| class="col4" | Received packet number from field Count in 0x84 and 0x8C<br />
|- class="row4"<br />
| class="col1 centeralign" | Packet Number #2<br />
| class="col2 centeralign" | 3 bytes<br />
| class="col3 centeralign" | <code>0x000004</code><br />
| class="col4" | Last received packet number (only when ''false'')<br />
|- class="row5"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 7 or 10 Bytes<br />
|}<br />
<br />
Sent after a 0x8X. It's used to ACK recieval of packets.<br />
The second packet number is optional and only there when bool is false.<br />
<br />
<br />
{{anchor|Packet_Encapsulation}}<br />
<br />
== Packet Encapsulation format ==<br />
The payload in 0x80-0x8F packets is encoded using different schemes.<br />
To decode them, you've to use the Encapsulation ID to check wich type you should use.<br />
The Encapsulation ID is the first byte of the payload.<br />
<br />
Multiple Data Encapsulation packets could be present in one packet. If you want to send data, use 0x00<br />
<br />
<br />
'''Calculate length in bytes:'''<br />
real length = length / 8<br />
<br />
<br />
=== 0x00 ===<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Encapsulation ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="2" | 0x00<br />
| class="col1 centeralign" | length<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>0x0090</code><br />
| class="col4" | Length of Packet in bits<br />
|- class="row2"<br />
| class="col2 centeralign" | Packet<br />
| class="col1 centeralign" | Data Packet<br />
| class="col2 centeralign" | <code>0x09d92145...</code><br />
| class="col3" | <br />
|- class="row3"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 3 Bytes + Packet Data length<br />
|}<br />
<br />
=== 0x40 ===<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Encapsulation ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="3" | 0x40<br />
| class="col1 centeralign" | length<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>0x0090</code><br />
| class="col4" | Length of Packet in bits<br />
|- class="row2"<br />
| class="col2 centeralign" | Count<br />
| class="col1 centeralign" | 3 bytes<br />
| class="col2 centeralign" | <code>0x000000</code><br />
| class="col3" | Unknown use<br />
|- class="row3"<br />
| class="col2 centeralign" | Packet<br />
| class="col1 centeralign" | Data Packet<br />
| class="col2 centeralign" | <code>0x09d92145...</code><br />
| class="col3" | <br />
|- class="row4"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 6 Bytes + Packet Data length<br />
|}<br />
<br />
=== 0x60 ===<br />
{| class="wikitable"<br />
|- class="row0"<br />
| class="col0" | Encapsulation ID<br />
| class="col1" | Field Name<br />
| class="col2" | Field Type<br />
| class="col3" | Example<br />
| class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0x60<br />
| class="col1 centeralign" | length<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>0x0090</code><br />
| class="col4" | Length of Packet in bits<br />
|- class="row2"<br />
| class="col2 centeralign" | Count<br />
| class="col1 centeralign" | 3 bytes<br />
| class="col2 centeralign" | <code>0x000000</code><br />
| class="col3" | Unknown use<br />
|- class="row3"<br />
| class="col2 centeralign" | Unknown<br />
| class="col1 centeralign" | 4 bytes<br />
| class="col2 centeralign" | <code>0x00000000</code><br />
| class="col3" | Only sent on first iteration<br />
|- class="row4"<br />
| class="col2 centeralign" | Packet<br />
| class="col1 centeralign" | Data Packet<br />
| class="col2 centeralign" | <code>0x09d92145...</code><br />
| class="col3" |<br />
|- class="row6"<br />
| class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 12 Bytes + Packet Data length<br />
|}<br />
<br />
<br />
== Data Packets ==<br />
<br />
This information has been generated using [https://github.com/PocketMine/PocketBurger PocketBurger], then edited manually.<br />
<br />
'''Minecraft: Pocket Edition v0.7.3, protocol #11'''<br />
<br />
'''RakNet Protocol version #5'''<br />
=== LoginPacket (0x82) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="5" | 0x82<br />
| Username<br />
| string8<br />
| <br />
|-<br />
| Protocol #1<br />
| int<br />
| <br />
|-<br />
| Protocol #2<br />
| int<br />
| <br />
|-<br />
| ClientID<br />
| int<br />
| <br />
|-<br />
| Realms Data<br />
| string8<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== LoginStatusPacket (0x83) ===<br />
<br />
''Server to Client''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="1" | 0x83<br />
| Status<br />
| int<br />
| <br />
|-<br />
<br />
|}<br />
<br />
The three type of status are:<br />
<br />
0: Everything is good.<br />
<br />
1: If the server is outdated.<br />
<br />
2. If the game is outdated. <br />
<br />
If everything is good you need to send the StartGamePacket<br />
<br />
=== ReadyPacket (0x84) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="1" | 0x84<br />
| bits[8] Status<br />
| byte<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== MessagePacket (0x85) ===<br />
<br />
''Two-Way''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="1" | 0x85<br />
| Message<br />
| string8<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== SetTimePacket (0x86) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="1" | 0x86<br />
| Time<br />
| int<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== StartGamePacket (0x87) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="7" | 0x87<br />
| level seed<br />
| int<br />
| <br />
|-<br />
| Unknown<br />
| int<br />
| <br />
|-<br />
| Gamemode<br />
| int<br />
| <br />
|-<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| X<br />
| float<br />
| <br />
|-<br />
| Y<br />
| float<br />
| <br />
|-<br />
| Z<br />
| float<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== AddMobPacket (0x88) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="8" | 0x88<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| Type<br />
| int<br />
| <br />
|-<br />
| X<br />
| float<br />
| <br />
|-<br />
| Y<br />
| float<br />
| <br />
|-<br />
| Z<br />
| float<br />
| <br />
|-<br />
| yaw<br />
| byte<br />
| <br />
|-<br />
| pitch<br />
| byte<br />
| <br />
|-<br />
| Metadata<br />
| byte[]<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== AddPlayerPacket (0x89) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="11" | 0x89<br />
| (unsigned) Client ID<br />
| long<br />
| <br />
|-<br />
| Username<br />
| string8<br />
| <br />
|-<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| X<br />
| float<br />
| <br />
|-<br />
| Y<br />
| float<br />
| <br />
|-<br />
| Z<br />
| float<br />
| <br />
|-<br />
| Yaw<br />
| byte<br />
| <br />
|-<br />
| Pitch<br />
| byte<br />
| <br />
|-<br />
| Unknown<br />
| short<br />
| <br />
|-<br />
| Unknown<br />
| short<br />
| <br />
|-<br />
| Metadata<br />
| byte[]<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== RemovePlayerPacket (0x8a) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="2" | 0x8a<br />
| entity ID<br />
| int<br />
| <br />
|-<br />
| (unsigned) Client ID<br />
| long<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== AddEntityPacket (0x8c) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="9" | 0x8c<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| Type<br />
| byte<br />
| <br />
|-<br />
| X<br />
| float<br />
| <br />
|-<br />
| Y<br />
| float<br />
| <br />
|-<br />
| Z<br />
| float<br />
| <br />
|-<br />
| Did?<br />
| int<br />
| If this int > 0 you can send the next parameter<br />
|-<br />
| SpeedX<br />
| short<br />
| <br />
|-<br />
| SpeedY<br />
| short<br />
| <br />
|-<br />
| SpeedZ<br />
| short<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== RemoveEntityPacket (0x8d) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="1" | 0x8d<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== AddItemEntityPacket (0x8e) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="10" | 0x8e<br />
| Enity ID<br />
| int<br />
| <br />
|-<br />
| Block<br />
| short<br />
| <br />
|-<br />
| Stack<br />
| byte<br />
| <br />
|-<br />
| Meta<br />
| short<br />
| <br />
|-<br />
| X<br />
| float<br />
| <br />
|-<br />
| Y<br />
| float<br />
| <br />
|-<br />
| Z<br />
| float<br />
| <br />
|-<br />
| Yaw<br />
| byte<br />
| <br />
|-<br />
| Pitch<br />
| byte<br />
| <br />
|-<br />
| Roll<br />
| byte<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== TakeItemEntityPacket (0x8f) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="2" | 0x8f<br />
| Target<br />
| int<br />
| <br />
|-<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== MoveEntityPacket (0x90) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="4" | 0x90<br />
| Entity ID<br />
| int<br />
|<br />
|-<br />
| X<br />
| float<br />
|<br />
|-<br />
| Y<br />
| float<br />
|<br />
|-<br />
| Z<br />
| float<br />
|<br />
|-<br />
<br />
|}<br />
<br />
=== MoveEntityPacket_PosRot (0x93) ===<br />
<br />
''None''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="6" | 0x93<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| X<br />
| float<br />
| <br />
|-<br />
| Y<br />
| float<br />
| <br />
|-<br />
| Z<br />
| float<br />
| <br />
|-<br />
| Yaw<br />
| float<br />
| <br />
|-<br />
| Pitch<br />
| float<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== MovePlayerPacket (0x94) ===<br />
<br />
''Two-Way''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="6" | 0x94<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| X<br />
| float<br />
| <br />
|-<br />
| Y<br />
| float<br />
| <br />
|-<br />
| Z<br />
| float<br />
| <br />
|-<br />
| Yaw<br />
| float<br />
| <br />
|-<br />
| Pitch<br />
| float<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== PlaceBlockPacket (0x95) ===<br />
<br />
''Two-Way''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="7" | 0x95<br />
| Entity iD<br />
| int<br />
| <br />
|-<br />
| X<br />
| int<br />
| <br />
|-<br />
| Z<br />
| int<br />
| <br />
|-<br />
| Y<br />
| byte<br />
| <br />
|-<br />
| Block<br />
| byte<br />
| <br />
|-<br />
| Meta<br />
| byte<br />
| <br />
|-<br />
| Face<br />
| byte<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== RemoveBlockPacket (0x96) ===<br />
<br />
''Server to Client''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="4" | 0x96<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| X<br />
| int<br />
| <br />
|-<br />
| Z<br />
| int<br />
| <br />
|-<br />
| Y<br />
| byte<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== UpdateBlockPacket (0x97) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="5" | 0x97<br />
| Entiy ID<br />
| int<br />
| <br />
|-<br />
| X<br />
| int<br />
| <br />
|-<br />
| Z<br />
| int<br />
| <br />
|-<br />
| Y<br />
| byte<br />
| <br />
|-<br />
| Block<br />
| byte<br />
| <br />
|-<br />
| Meta<br />
| byte<br />
|<br />
|-<br />
<br />
|}<br />
<br />
=== AddPaintingPacket (0x98) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="6" | 0x98<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| X<br />
| int<br />
| <br />
|-<br />
| Y<br />
| int<br />
| <br />
|-<br />
| Z<br />
| int<br />
| <br />
|-<br />
| Direction<br />
| int<br />
| <br />
|-<br />
| Title<br />
| string8<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== ExplodePacket (0x99) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="8" | 0x99<br />
| X<br />
| float<br />
| <br />
|-<br />
| Y<br />
| float<br />
| <br />
|-<br />
| Z<br />
| float<br />
| <br />
|-<br />
| Radius<br />
| float<br />
| <br />
|-<br />
| Count<br />
| int<br />
| <br />
|-<br />
| Records<br />
| byte<br />
| <br />
|-<br />
| Counts?<br />
| byte<br />
| <br />
|-<br />
| Records?<br />
| byte<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== LevelEventPacket (0x9a) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="5" | 0x9a<br />
| Unknown?<br />
| short<br />
| <br />
|-<br />
| Unknown?<br />
| short<br />
| <br />
|-<br />
| Unknown?<br />
| short<br />
| <br />
|-<br />
| Unknown?<br />
| short<br />
| <br />
|-<br />
| Unknown?<br />
| int<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== TileEventPacket (0x9b) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="5" | 0x9b<br />
| X<br />
| int<br />
| <br />
|-<br />
| Y<br />
| int<br />
| <br />
|-<br />
| Z<br />
| int<br />
| <br />
|-<br />
| Case 1<br />
| int<br />
| <br />
|-<br />
| Case 2<br />
| int<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== EntityEventPacket (0x9c) ===<br />
<br />
''Two-Way''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="2" | 0x9c<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| Event<br />
| byte<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== RequestChunkPacket (0x9d) ===<br />
<br />
''Server to Client''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="2" | 0x9d<br />
| X<br />
| int<br />
| <br />
|-<br />
| Z<br />
| int<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== ChunkDataPacket (0x9e) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="5" | 0x9e<br />
| X<br />
| int<br />
| <br />
|-<br />
| Z<br />
| int<br />
| <br />
|-Data?<br />
| byte<br />
| <br />
|-<br />
| Data?<br />
| byte[]<br />
| <br />
|-<br />
| Data?<br />
| byte[]<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== PlayerEquipmentPacket (0x9f) ===<br />
<br />
''Two-Way''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="4" | 0x9f<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| Block<br />
| short<br />
| <br />
|-<br />
| Meta<br />
| short<br />
| <br />
|-<br />
| Slot<br />
| byte<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== PlayerArmorEquipmentPacket (0xa0) ===<br />
<br />
''Two-Way''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="5" | 0xa0<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| Slot 1<br />
| byte<br />
| <br />
|-<br />
| Slot 2<br />
| byte<br />
| <br />
|-<br />
| Slot 3<br />
| byte<br />
| <br />
|-<br />
| Slot 4<br />
| byte<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== InteractPacket (0xa1) ===<br />
<br />
''Two-Way''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="3" | 0xa1<br />
| Action<br />
| byte[]<br />
| <br />
|-<br />
| entity ID<br />
| int<br />
| <br />
|-<br />
| Target<br />
| int<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== UseItemPacket (0xa2) ===<br />
<br />
''Server to Client''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="13" | 0xa2<br />
| X<br />
| int<br />
| <br />
|-<br />
| Y<br />
| int<br />
| <br />
|-<br />
| Z<br />
| int<br />
| <br />
|-<br />
| Face<br />
| int<br />
| <br />
|-<br />
| Block<br />
| byte[]<br />
| <br />
|-<br />
| Meta<br />
| byte<br />
| <br />
|-<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| Fx<br />
| float<br />
| <br />
|-<br />
| Fy<br />
| float<br />
| <br />
|-<br />
| Fz<br />
| float<br />
| <br />
|-<br />
| PosX<br />
| float<br />
| <br />
|-<br />
| PosY<br />
| float<br />
| <br />
|-<br />
| PosZ<br />
| float<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== PlayerActionPacket (0xa3) ===<br />
<br />
''Server to Client''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="6" | 0xa3<br />
| Action<br />
| int<br />
| <br />
|-<br />
| X<br />
| int<br />
| <br />
|-<br />
| Y<br />
| int<br />
| <br />
|-<br />
| Z<br />
| int<br />
| <br />
|-<br />
| Face<br />
| int<br />
| <br />
|-<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== HurtArmorPacket (0xa5) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="1" | 0xa5<br />
| Health<br />
| byte<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== SetEntityDataPacket (0xa6) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="2" | 0xa6<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| Metadata<br />
| byte[]<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== SetEntityMotionPacket (0xa7) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="5" | 0xa7<br />
| Unknown?<br />
| byte<br />
| <br />
|-<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| X<br />
| short<br />
| <br />
|-<br />
| Y<br />
| short<br />
| <br />
|-<br />
| Z<br />
| short<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== SetRidingPacket (0xa8) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="2" | 0xa8<br />
| a<br />
| int<br />
| <br />
|-<br />
| b<br />
| int<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== SetHealthPacket (0xa9) ===<br />
<br />
''Two-Way''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="1" | 0xa9<br />
| Health<br />
| byte<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== SetSpawnPositionPacket (0xaa) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="3" | 0xaa<br />
| X<br />
| int<br />
| <br />
|-<br />
| Z<br />
| int<br />
| <br />
|-<br />
| Y<br />
| byte<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== AnimatePacket (0xab) ===<br />
<br />
''Two-Way''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="2" | 0xab<br />
| Action<br />
| byte<br />
| <br />
|-<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== RespawnPacket (0xac) ===<br />
<br />
''Two-Way''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="4" | 0xac<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| X<br />
| float<br />
| <br />
|-<br />
| Y<br />
| float<br />
| <br />
|-<br />
| Z<br />
| float<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== SendInventoryPacket (0xad) ===<br />
<br />
''None''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="5" | 0xad<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| Windows ID<br />
| byte<br />
| <br />
|-<br />
| Count<br />
| short<br />
| <br />
|-<br />
| Slots<br />
| byte[]<br />
| <br />
|-<br />
| Items<br />
| byte[]<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== DropItemPacket (0xae) ===<br />
<br />
''Server to Client''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="5" | 0xae<br />
| Entity ID<br />
| int<br />
| <br />
|-<br />
| Unknown?<br />
| byte<br />
| <br />
|-<br />
| Block<br />
| short<br />
| <br />
|-<br />
| Stack<br />
| byte<br />
|<br />
|-<br />
| Meta<br />
| short<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== ContainerOpenPacket (0xaf) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="4" | 0xaf<br />
| Window ID<br />
| byte<br />
| <br />
|-<br />
| Type<br />
| byte<br />
| <br />
|-<br />
| Slot<br />
| byte<br />
| <br />
|-<br />
| Title<br />
| string8<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== ContainerClosePacket (0xb0) ===<br />
<br />
''Two-Way''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="1" | 0xb0<br />
| Window ID<br />
| byte<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== ContainerSetSlotPacket (0xb1) ===<br />
<br />
''Two-Way''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="5" | 0xb1<br />
| Window ID<br />
| byte<br />
| <br />
|-<br />
| Slot<br />
| short<br />
| <br />
|-<br />
| Block<br />
| short<br />
| <br />
|-<br />
| Stack<br />
| byte<br />
| <br />
|-<br />
| Meta<br />
| short<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== ContainerSetDataPacket (0xb2) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="3" | 0xb2<br />
| Window ID<br />
| byte<br />
| <br />
|-<br />
| Property<br />
| short<br />
| <br />
|-<br />
| Value<br />
| short<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== ContainerSetContentPacket (0xb3) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="3" | 0xb3<br />
| Window ID<br />
| byte<br />
| <br />
|-<br />
| Count<br />
| short<br />
| <br />
|-<br />
| Items<br />
| byte[]<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== ContainerAckPacket (0xb4) ===<br />
<br />
''None''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="2" | 0xb4<br />
| Window ID<br />
| byte<br />
| <br />
|-<br />
| Unknown?<br />
| short<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== ChatPacket (0xb5) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="1" | 0xb5<br />
| Message<br />
| string8<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== SignUpdatePacket (0xb6) ===<br />
<br />
''Two-Way''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="4" | 0xb6<br />
| X<br />
| short<br />
| <br />
|-<br />
| Y<br />
| byte<br />
| <br />
|-<br />
| Z<br />
| short<br />
| <br />
|-<br />
| Lines<br />
| string8<br />
| <br />
|-<br />
<br />
|}<br />
<br />
=== AdventureSettingsPacket (0xb7) ===<br />
<br />
''Client to Server''<br />
<br />
<br />
{| class="wikitable"<br />
|-<br />
| Packet ID<br />
| Field Name<br />
| Field Type<br />
| Notes<br />
|-<br />
| rowspan="1" | 0xb7<br />
| Flags<br />
| byte[]<br />
| <br />
|-<br />
<br />
|}<br />
<br />
<br />
<br />
[[Category:Pocket Minecraft]]</div>
Gurun
https://wiki.vg/index.php?title=Pocket_Edition_FAQ&diff=6129
Pocket Edition FAQ
2014-09-26T13:40:49Z
<p>Gurun: /* Normal Login Sequence */</p>
<hr />
<div><br />
See [[Pocket_Editon_Login]] for the login sequence for the MPCE protocol.</div>
Gurun
https://wiki.vg/index.php?title=Pocket_Edition_Login&diff=6128
Pocket Edition Login
2014-09-26T13:36:07Z
<p>Gurun: Created page with "== Normal Login Sequence == C = Client S = Server B = Broadcast === Server searching === #'''C->B''' <code>0x01</code> ID_UNCONNECTED_PING_OPEN_CONNECTIONS #'''S->C''' <co..."</p>
<hr />
<div>== Normal Login Sequence ==<br />
C = Client<br />
S = Server<br />
B = Broadcast<br />
<br />
=== Server searching ===<br />
#'''C->B''' <code>0x01</code> ID_UNCONNECTED_PING_OPEN_CONNECTIONS<br />
#'''S->C''' <code>0x1C</code> ID_UNCONNECTED_PONG<br />
<br />
=== Connecting a server ===<br />
#'''C->S''' <code>0x05</code> ID_OPEN_CONNECTION_REQUEST_1 (different packet sizes until a correct response is sent)<br />
#'''S->C''' <code>0x06</code> ID_OPEN_CONNECTION_REPLY_1<br />
#'''C->S''' <code>0x07</code> ID_OPEN_CONNECTION_REQUEST_2<br />
#'''S->C''' <code>0x08</code> ID_OPEN_CONNECTION_REPLY_2<br />
#'''C->S''' <code>0x09</code> DATA ClientConnect<br />
#'''S->C''' <code>0x10</code> DATA ServerHandshake<br />
#'''C->S''' <code>0x13</code> DATA ClientHandshake<br />
#'''C->S''' <code>0x82</code> DATA Login (sends username)<br />
#'''S->C''' <code>0x83</code> DATA LoginStatus<br />
#'''S->C''' <code>0x87</code> DATA StartGame (send seed and spawn position)<br />
#'''C''' ''Generates base map with seed''<br />
#'''C->S''' <code>0x84</code> DATA Ready (client spawns)<br />
<br />
[[Category:Pocket Minecraft]]</div>
Gurun