Entities: Difference between revisions
Jump to navigation
Jump to search
imported>KPReid (condense object type headings) |
imported>Barneygale No edit summary |
||
| Line 1: | Line 1: | ||
== Metadata Format == | |||
The metadata format is quirky dictionary format, where the key and the value's type are packed in a single byte. | |||
To parse, repeat the following procedure: | |||
1) Read an unsigned byte | |||
2) If this byte == 127, stop reading | |||
3) Decompose the byte. | |||
The bottom 5 bytes (0x1F) serve as an identifier (key) for the data to follow. | |||
The top 3 bits (0xE0) serve as a type: | |||
0: byte | |||
1: short | |||
2: int | |||
3: float | |||
4: string16, | |||
5: short, byte, short (slot type) | |||
6: int, int, int | |||
4) Read and unpack based on the type (above) | |||
In python: | |||
#socket is positioned at the beginning of the metadata array | |||
metadata = {} | |||
x = socket.unpack('byte') | |||
while x != 127: | |||
index = x & 0x1F # Lower 5 bits | |||
ty = x >> 5 # Upper 3 bites | |||
if ty == 0: val = socket.unpack('byte') | |||
if ty == 1: val = socket.unpack('short') | |||
if ty == 2: val = socket.unpack('int') | |||
if ty == 3: val = socket.unpack('float') | |||
if ty == 4: val = socket.unpack('string16') | |||
if ty == 5: | |||
val = {} | |||
val["id"] = socket.unpack('short') | |||
val["count"] = socket.unpack('byte') | |||
val["damage"] = socket.unpack('short') | |||
if ty == 6: | |||
val = [] | |||
for i in range(3): | |||
val.append(socket.unpack('int')) | |||
metadata[index] = (ty, val) | |||
x = socket.unpack('byte') | |||
return metadata | |||
== Common Metadata == | |||
=== Index 0: Flags === | |||
All mobs, objects and players send metadata with index <code>0</code>. The value is a byte representing 8 boolean flags: | |||
{| class="wikitable" | |||
|- class="row0" | |||
! class="col0" | Bit index | |||
! class="col1" | Bit mask | |||
! class="col2" | Meaning | |||
|- class="row1" | |||
| class="col0" | 0 | |||
| class="col1" | 0x01 | |||
| class="col2" | Entity on fire | |||
|- class="row2" | |||
| class="col0" | 1 | |||
| class="col1" | 0x02 | |||
| class="col2" | Entity crouched | |||
|- class="row3" | |||
| class="col0" | 2 | |||
| class="col1" | 0x04 | |||
| class="col2" | Entity riding | |||
|- class="row4" | |||
| class="col0" | 3 | |||
| class="col1" | 0x08 | |||
| class="col2" | Sprinting | |||
|- class="row4" | |||
| class="col0" | 4 | |||
| class="col1" | 0x10 | |||
| class="col2" | Eating/Drinking | |||
|} | |||
=== Index 8: Potion effects === | |||
Players and most (all?) mobs send metadata with index <code>8</code>. This specifies the colour of the bubbling effects around the player. | |||
The value is an int, that should be decomposed into four 4-bit nibbles, representing <code>0x00RRGGBB</code> | |||
If the value is 0, no potion effects currently apply to the entity. | |||
== Mobs == | |||
Mobs are spawned via [[Protocol#Mob_Spawn_.280x18.29|0x18 Mob Spawn]] | |||
=== 50: Creeper === | |||
* <div class="li">Dimensions: 0.6 * 1.8 | |||
* '''Index 16''' (byte): Status. Depends on the fuse | |||
* '''Index 17''' (byte): Charged. <code>1</code> if the creeper has been hit by lightning, <code>0</code> otherwise. | |||
=== 51: Skeleton === | |||
* <div class="li">Dimensions: 0.6 * 1.8 | |||
* No extra metadata | |||
=== 52: Spider === | |||
* <div class="li">Dimensions: 1.4 * 0.9 (note: has this changed?) | |||
* No extra metadata | |||
=== 53: Giant Zombie === | |||
* <div class="li">Dimensions: 3.6 * 10.8 | |||
* No extra metadata | |||
=== 54: Zombie === | |||
* <div class="li">Dimensions: 0.6 * 1.8 | |||
* No extra metadata | |||
=== 55: Slime === | |||
* <div class="li">Dimensions: 0.6*size * 0.6*size | |||
* '''Index 16''' (byte): Size. Randomly-generated. <code>0</code>, <code>1</code>, <code>2</code> or <code>4</code>. | |||
=== 56: Ghast === | |||
* <div class="li">Dimensions: 4 * 4 | |||
* '''Index 16''' (byte): Aggression. <code>1</code> for aggressive (red eyes), <code>0</code> otherwise. | |||
=== 57: Zombie Pigman === | |||
* <div class="li">Dimensions: 0.6 * 1.8 | |||
* No extra metadata | |||
=== 58: Enderman === | |||
* <div class="li">Dimensions: Unknown | |||
* '''Index 16''' (byte): Item in hand | |||
* '''Index 17''' (byte): Aggression. <code>1</code> for aggressive, <code>0</code> otherwise. | |||
=== 59: Cave Spider === | |||
* <div class="li">Dimensions: Unknown | |||
* No extra metadata | |||
=== 60: Silverfish === | |||
* <div class="li">Dimensions: Unknown | |||
* No extra metadata | |||
=== 61: Blaze === | |||
* <div class="li">Dimensions: Unknown | |||
* No extra metadata | |||
=== 62: Magma Cube === | |||
* <div class="li">Dimensions: 0.6*size * 0.6*size | |||
* '''Index 16''' (byte): Size. Randomly-generated. <code>0</code>, <code>1</code>, <code>2</code> or <code>4</code>. | |||
=== 63: Ender Dragon === | |||
* <div class="li">Dimensions: Unknown | |||
* No extra metadata | |||
=== 90: Pig === | |||
* <div class="li">Dimensions: 0.9 * 0.9 | |||
* '''Index 16''' (byte): Saddled. <code>1</code> if the pig is wearing a saddle, <code>0</code> otherwise. | |||
=== 91: Sheep === | |||
* <div class="li">Dimensions: 0.9 * 1.3 | |||
* '''Index 16''' (byte): bit 0x10 indicates shearedness. bits 0x0F indicate color (see below). | |||
{| class="wikitable" | {| class="wikitable" | ||
|- class="row0" | |||
|- | ! class="col0" | Index | ||
! | ! class="col1" | Wool Color | ||
|- class="row1" | |||
| class="col0" | 0 | |||
| class="col1" | White | |||
|- class="row2" | |||
| class="col0" | 1 | |||
| | | class="col1" | Orange | ||
! | |- class="row3" | ||
| class="col0" | 2 | |||
| class="col1" | Magenta | |||
|- class="row4" | |||
| | | class="col0" | 3 | ||
|- | | class="col1" | LightBlue | ||
|- class="row5" | |||
| | | class="col0" | 4 | ||
| class="col1" | Yellow | |||
| 0 | |- class="row6" | ||
| class="col0" | 5 | |||
| | | class="col1" | Lime | ||
|- class="row7" | |||
| class="col0" | 6 | |||
| class="col1" | Pink | |||
|- class="row8" | |||
| class="col0" | 7 | |||
|- | | class="col1" | Gray | ||
| | |- class="row9" | ||
| class="col0" | 8 | |||
| 1 | | class="col1" | Silver | ||
| | |- class="row10" | ||
| class="col0" | 9 | |||
| class="col1" | Cyan | |||
|- class="row11" | |||
| class="col0" | 10 | |||
| | | class="col1" | Purple | ||
|- | |- class="row12" | ||
| | | class="col0" | 11 | ||
| | | class="col1" | Blue | ||
| | |- class="row13" | ||
| | | class="col0" | 12 | ||
|- | | class="col1" | Brown | ||
| | |- class="row14" | ||
| | | class="col0" | 13 | ||
| | | class="col1" | Green | ||
| | |- class="row15" | ||
|- | | class="col0" | 14 | ||
| | | class="col1" | Red | ||
|- class="row16" | |||
| class="col0" | 15 | |||
| class="col1" | Black | |||
| 4 | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| 12 | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
| | |||
|} | |} | ||
=== 92: Cow === | |||
* <div class="li">Dimensions: 0.9 * 1.3 | |||
* No extra metadata | |||
=== 93: Duck === | |||
* <div class="li">Dimensions: 0.3 * 0.4 | |||
* No extra metadata | |||
=== 94: Squid === | |||
* <div class="li">Dimensions: 0.95 * 0.95 | |||
* No extra metadata | |||
=== 95: Wolf === | |||
* <div class="li">Dimensions: Unknown | |||
* '''Index 16''' (byte): Flags (see below). | |||
* '''Index 17''' (string): Name of player that tamed wolf. | |||
* '''Index 18''' (int): Health. | |||
{| class="wikitable" | |||
|- class="row0" | |||
! class="col0" | Bit index | |||
! class="col1" | Bit mask | |||
! class="col2" | Meaning | |||
|- class="row1" | |||
| class="col0" | 0 | |||
| class="col1" | 0x01 | |||
| class="col2" | Sitting down | |||
|- class="row2" | |||
| class="col0" | 1 | |||
| class="col1" | 0x02 | |||
| class="col2" | Agressive (red eyes) | |||
|- class="row3" | |||
| class="col0" | 2 | |||
| class="col1" | 0x04 | |||
| class="col2" | Tamed | |||
|} | |||
=== 96: Mooshroom? === | |||
Suspected to be mooshroom, but currently undocumented | |||
=== 97: Snowman === | |||
* <div class="li">Dimensions: Unknown | |||
* No extra metadata | |||
=== 120: Villager === | |||
* <div class="li">Dimensions: Unknown | |||
* No extra metadata | |||
== Objects == | |||
{| class="wikitable" | |||
|- class="row0" | |||
! class="col0" | ID | |||
! class="col1" | Name | |||
! class="col2" | Width | |||
! class="col3" | Height | |||
|- class="row1" | |||
| class="col0" | 1 | |||
| class="col1" | Boat | |||
| class="col2" | 1.5 | |||
| class="col3" | 0.6 | |||
|- class="row2" | |||
| class="col0" | 10 | |||
| class="col1" | Minecart | |||
| class="col2" | 0.98 | |||
| class="col3" | 0.7 | |||
|- class="row3" | |||
| class="col0" | 11 | |||
| class="col1" | Minecart (storage) | |||
| class="col2" | 0.98 | |||
| class="col3" | 0.7 | |||
|- class="row4" | |||
| class="col0" | 12 | |||
| class="col1" | Minecart (powered) | |||
| class="col2" | 0.98 | |||
| class="col3" | 0.7 | |||
|- class="row5" | |||
| class="col0" | 50 | |||
| class="col1" | Activated TNT | |||
| class="col2" | 0.98 | |||
| class="col3" | 0.98 | |||
|- class="row6" | |||
| class="col0" | 60 | |||
| class="col1" | Arrow (projectile) | |||
| class="col2" | 0.5 | |||
| class="col3" | 0.5 | |||
|- class="row7" | |||
| class="col0" | 61 | |||
| class="col1" | Snowball (projectile) | |||
| class="col2" | 0.25 | |||
| class="col3" | 0.25 | |||
|- class="row8" | |||
| class="col0" | 62 | |||
| class="col1" | Egg (projectile) | |||
| class="col2" | 0.25 | |||
| class="col3" | 0.25 | |||
|- class="row9" | |||
| class="col0" | 70 | |||
| class="col1" | Falling Sand | |||
| class="col2" | 0.98 | |||
| class="col3" | 0.98 | |||
|- class="row10" | |||
| class="col0" | 71 | |||
| class="col1" | Falling Gravel | |||
| class="col2" | 0.98 | |||
| class="col3" | 0.98 | |||
|- class="row11" | |||
| class="col0" | 90 | |||
| class="col1" | Fishing Float | |||
| class="col2" | 0.25? | |||
| class="col3" | 0.25? | |||
|} | |||
== Other == | |||
Player entities have dimensions 0.6 * 1.8 | |||
Pickups have dimensions 0.25 * 0.25 | |||
Revision as of 19:21, 28 October 2011
Metadata Format
The metadata format is quirky dictionary format, where the key and the value's type are packed in a single byte.
To parse, repeat the following procedure:
1) Read an unsigned byte
2) If this byte == 127, stop reading
3) Decompose the byte.
The bottom 5 bytes (0x1F) serve as an identifier (key) for the data to follow.
The top 3 bits (0xE0) serve as a type:
0: byte
1: short
2: int
3: float
4: string16,
5: short, byte, short (slot type)
6: int, int, int
4) Read and unpack based on the type (above)
In python:
#socket is positioned at the beginning of the metadata array
metadata = {}
x = socket.unpack('byte')
while x != 127:
index = x & 0x1F # Lower 5 bits
ty = x >> 5 # Upper 3 bites
if ty == 0: val = socket.unpack('byte')
if ty == 1: val = socket.unpack('short')
if ty == 2: val = socket.unpack('int')
if ty == 3: val = socket.unpack('float')
if ty == 4: val = socket.unpack('string16')
if ty == 5:
val = {}
val["id"] = socket.unpack('short')
val["count"] = socket.unpack('byte')
val["damage"] = socket.unpack('short')
if ty == 6:
val = []
for i in range(3):
val.append(socket.unpack('int'))
metadata[index] = (ty, val)
x = socket.unpack('byte')
return metadata
Common Metadata
Index 0: Flags
All mobs, objects and players send metadata with index 0. The value is a byte representing 8 boolean flags:
| Bit index | Bit mask | Meaning |
|---|---|---|
| 0 | 0x01 | Entity on fire |
| 1 | 0x02 | Entity crouched |
| 2 | 0x04 | Entity riding |
| 3 | 0x08 | Sprinting |
| 4 | 0x10 | Eating/Drinking |
Index 8: Potion effects
Players and most (all?) mobs send metadata with index 8. This specifies the colour of the bubbling effects around the player.
The value is an int, that should be decomposed into four 4-bit nibbles, representing 0x00RRGGBB
If the value is 0, no potion effects currently apply to the entity.
Mobs
Mobs are spawned via 0x18 Mob Spawn
50: Creeper
- Dimensions: 0.6 * 1.8
- Index 16 (byte): Status. Depends on the fuse
- Index 17 (byte): Charged.
1if the creeper has been hit by lightning,0otherwise.
51: Skeleton
- Dimensions: 0.6 * 1.8
- No extra metadata
52: Spider
- Dimensions: 1.4 * 0.9 (note: has this changed?)
- No extra metadata
53: Giant Zombie
- Dimensions: 3.6 * 10.8
- No extra metadata
54: Zombie
- Dimensions: 0.6 * 1.8
- No extra metadata
55: Slime
- Dimensions: 0.6*size * 0.6*size
- Index 16 (byte): Size. Randomly-generated.
0,1,2or4.
56: Ghast
- Dimensions: 4 * 4
- Index 16 (byte): Aggression.
1for aggressive (red eyes),0otherwise.
57: Zombie Pigman
- Dimensions: 0.6 * 1.8
- No extra metadata
58: Enderman
- Dimensions: Unknown
- Index 16 (byte): Item in hand
- Index 17 (byte): Aggression.
1for aggressive,0otherwise.
59: Cave Spider
- Dimensions: Unknown
- No extra metadata
60: Silverfish
- Dimensions: Unknown
- No extra metadata
61: Blaze
- Dimensions: Unknown
- No extra metadata
62: Magma Cube
- Dimensions: 0.6*size * 0.6*size
- Index 16 (byte): Size. Randomly-generated.
0,1,2or4.
63: Ender Dragon
- Dimensions: Unknown
- No extra metadata
90: Pig
- Dimensions: 0.9 * 0.9
- Index 16 (byte): Saddled.
1if the pig is wearing a saddle,0otherwise.
91: Sheep
- Dimensions: 0.9 * 1.3
- Index 16 (byte): bit 0x10 indicates shearedness. bits 0x0F indicate color (see below).
| Index | Wool Color |
|---|---|
| 0 | White |
| 1 | Orange |
| 2 | Magenta |
| 3 | LightBlue |
| 4 | Yellow |
| 5 | Lime |
| 6 | Pink |
| 7 | Gray |
| 8 | Silver |
| 9 | Cyan |
| 10 | Purple |
| 11 | Blue |
| 12 | Brown |
| 13 | Green |
| 14 | Red |
| 15 | Black |
92: Cow
- Dimensions: 0.9 * 1.3
- No extra metadata
93: Duck
- Dimensions: 0.3 * 0.4
- No extra metadata
94: Squid
- Dimensions: 0.95 * 0.95
- No extra metadata
95: Wolf
- Dimensions: Unknown
- Index 16 (byte): Flags (see below).
- Index 17 (string): Name of player that tamed wolf.
- Index 18 (int): Health.
| Bit index | Bit mask | Meaning |
|---|---|---|
| 0 | 0x01 | Sitting down |
| 1 | 0x02 | Agressive (red eyes) |
| 2 | 0x04 | Tamed |
96: Mooshroom?
Suspected to be mooshroom, but currently undocumented
97: Snowman
- Dimensions: Unknown
- No extra metadata
120: Villager
- Dimensions: Unknown
- No extra metadata
Objects
| ID | Name | Width | Height |
|---|---|---|---|
| 1 | Boat | 1.5 | 0.6 |
| 10 | Minecart | 0.98 | 0.7 |
| 11 | Minecart (storage) | 0.98 | 0.7 |
| 12 | Minecart (powered) | 0.98 | 0.7 |
| 50 | Activated TNT | 0.98 | 0.98 |
| 60 | Arrow (projectile) | 0.5 | 0.5 |
| 61 | Snowball (projectile) | 0.25 | 0.25 |
| 62 | Egg (projectile) | 0.25 | 0.25 |
| 70 | Falling Sand | 0.98 | 0.98 |
| 71 | Falling Gravel | 0.98 | 0.98 |
| 90 | Fishing Float | 0.25? | 0.25? |
Other
Player entities have dimensions 0.6 * 1.8
Pickups have dimensions 0.25 * 0.25