Entity metadata: Difference between revisions
imported>Barneygale |
imported>Barneygale |
||
Line 90: | Line 90: | ||
Mobs are spawned via [[Protocol#Mob_Spawn_.280x18.29|0x18 Mob Spawn]] | Mobs are spawned via [[Protocol#Mob_Spawn_.280x18.29|0x18 Mob Spawn]] | ||
=== 50 | {| class="wikitable" | ||
|- class="row0" | |||
! class="col0" | Type | |||
! class="col1" | Name | |||
! class="col2" | x, z | |||
! class="col3" | y | |||
=== | |- class="row1" | ||
| class="col0" | 50 | |||
| class="col1" | Creeper | |||
| class="col2" | 0.6 | |||
| class="col3" | 1.8 | |||
=== | |- class="row2" | ||
| class="col0" | 51 | |||
* | | class="col1" | Skeleton | ||
| class="col2" | 0.6 | |||
| class="col3" | 1.8 | |||
=== | |- class="row3" | ||
| class="col0" | 52 | |||
| class="col1" | Spider | |||
| class="col2" | 1.4 | |||
| class="col3" | 0.9 | |||
=== | |- class="row4" | ||
| class="col0" | 53 | |||
| class="col1" | Giant Zombie | |||
| class="col2" | 3.6 | |||
| class="col3" | 10.8 | |||
|- class="row5" | |||
| class="col0" | 54 | |||
| class="col1" | Zombie | |||
| class="col2" | 0.6 | |||
| class="col3" | 1.8 | |||
|- class="row6" | |||
| class="col0" | 55 | |||
| class="col1" | Slime | |||
| class="col2" | 0.6 * size | |||
| class="col3" | 0.6 * size | |||
|- class="row7" | |||
| class="col0" | 56 | |||
| class="col1" | Ghast | |||
| class="col2" | 4 | |||
| class="col3" | 4 | |||
|- class="row8" | |||
| class="col0" | 57 | |||
| class="col1" | Zombie Pigman | |||
| class="col2" | 0.6 | |||
| class="col3" | 1.8 | |||
|- class="row9" | |||
| class="col0" | 58 | |||
| class="col1" | Enderman | |||
| class="col2" | | |||
| class="col3" | | |||
|- class="row10" | |||
| class="col0" | 59 | |||
| class="col1" | Cave Spider | |||
| class="col2" | | |||
| class="col3" | | |||
|- class="row11" | |||
| class="col0" | 60 | |||
| class="col1" | Silverfish | |||
| class="col2" | | |||
| class="col3" | | |||
|- class="row12" | |||
| class="col0" | 61 | |||
| class="col1" | Blaze | |||
| class="col2" | | |||
| class="col3" | | |||
|- class="row13" | |||
| class="col0" | 62 | |||
| class="col1" | Magma Cube | |||
| class="col2" | 0.6 * size | |||
| class="col3" | 0.6 * size | |||
|- class="row14" | |||
| class="col0" | 63 | |||
| class="col1" | Ender Dragon | |||
| class="col2" | | |||
| class="col3" | | |||
|- class="row15" | |||
| class="col0" | 90 | |||
| class="col1" | Pig | |||
| class="col2" | 0.9 | |||
| class="col3" | 0.9 | |||
|- class="row16" | |||
| class="col0" | 91 | |||
| class="col1" | Sheep | |||
| class="col2" | 0.6 | |||
| class="col3" | 1.3 | |||
|- class="row17" | |||
| class="col0" | 92 | |||
| class="col1" | Cow | |||
| class="col2" | 0.9 | |||
| class="col3" | 1.3 | |||
|- class="row18" | |||
| class="col0" | 93 | |||
| class="col1" | Duck | |||
| class="col2" | 0.3 | |||
| class="col3" | 0.4 | |||
|- class="row19" | |||
| class="col0" | 94 | |||
| class="col1" | Squid | |||
| class="col2" | 0.95 | |||
| class="col3" | 0.95 | |||
|- class="row20" | |||
| class="col0" | 95 | |||
| class="col1" | Wolf | |||
| class="col2" | 0.6 | |||
| class="col3" | 1.8 | |||
|- class="row21" | |||
| class="col0" | 96 | |||
| class="col1" | Mooshroom? | |||
| class="col2" | | |||
| class="col3" | | |||
|- class="row22" | |||
| class="col0" | 97 | |||
| class="col1" | Snowman | |||
| class="col2" | | |||
| class="col3" | | |||
|- class="row23" | |||
| class="col0" | 120 | |||
| class="col1" | Villager | |||
| class="col2" | | |||
| class="col3" | | |||
|} | |||
=== | === Extra Metadata === | ||
==== Creeper ==== | |||
* 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. | |||
==== Slime / Magma Cube ==== | |||
* Index '''16''' (byte): Size. Randomly-generated. <code>0</code>, <code>1</code>, <code>2</code> or <code>4</code>. | |||
==== Ghast ==== | |||
* Index '''16''' (byte): Aggression. <code>1</code> for aggressive (red eyes), <code>0</code> otherwise. | |||
==== Enderman ==== | |||
* Index '''16''' (byte): Item in hand | |||
* Index '''17''' (byte): Aggression. <code>1</code> for aggressive, <code>0</code> otherwise. | |||
==== Pig ==== | |||
* Index '''16''' (byte): Saddled. <code>1</code> if the pig is wearing a saddle, <code>0</code> otherwise. | |||
==== Sheep ==== | |||
* Index '''16''' (byte): bit 0x10 indicates shearedness. bits 0x0F indicate color (see below). | |||
* | |||
{| class="wikitable" | {| class="wikitable" | ||
Line 226: | Line 295: | ||
|} | |} | ||
==== Wolf ==== | |||
* <div class="li">Index '''16''' (byte): Flags (see below). | |||
* Index '''17''' (string): Name of player that tamed wolf. | |||
* <div class="li"> | * Index '''18''' (int): Health. | ||
* ''' | |||
* ''' | |||
{| class="wikitable" | {| class="wikitable" | ||
Line 261: | Line 313: | ||
| class="col0" | 1 | | class="col0" | 1 | ||
| class="col1" | 0x02 | | class="col1" | 0x02 | ||
| class="col2" | | | class="col2" | Aggressive (red eyes) | ||
|- class="row3" | |- class="row3" | ||
| class="col0" | 2 | | class="col0" | 2 | ||
Line 267: | Line 319: | ||
| class="col2" | Tamed | | class="col2" | Tamed | ||
|} | |} | ||
== Objects == | == Objects == |
Revision as of 21:33, 28 October 2011
Entity Metadata Format
The entity 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
Type | Name | x, z | y |
---|---|---|---|
50 | Creeper | 0.6 | 1.8 |
51 | Skeleton | 0.6 | 1.8 |
52 | Spider | 1.4 | 0.9 |
53 | Giant Zombie | 3.6 | 10.8 |
54 | Zombie | 0.6 | 1.8 |
55 | Slime | 0.6 * size | 0.6 * size |
56 | Ghast | 4 | 4 |
57 | Zombie Pigman | 0.6 | 1.8 |
58 | Enderman | ||
59 | Cave Spider | ||
60 | Silverfish | ||
61 | Blaze | ||
62 | Magma Cube | 0.6 * size | 0.6 * size |
63 | Ender Dragon | ||
90 | Pig | 0.9 | 0.9 |
91 | Sheep | 0.6 | 1.3 |
92 | Cow | 0.9 | 1.3 |
93 | Duck | 0.3 | 0.4 |
94 | Squid | 0.95 | 0.95 |
95 | Wolf | 0.6 | 1.8 |
96 | Mooshroom? | ||
97 | Snowman | ||
120 | Villager |
Extra Metadata
Creeper
- Index 16 (byte): Status. Depends on the fuse
- Index 17 (byte): Charged.
1
if the creeper has been hit by lightning,0
otherwise.
Slime / Magma Cube
- Index 16 (byte): Size. Randomly-generated.
0
,1
,2
or4
.
Ghast
- Index 16 (byte): Aggression.
1
for aggressive (red eyes),0
otherwise.
Enderman
- Index 16 (byte): Item in hand
- Index 17 (byte): Aggression.
1
for aggressive,0
otherwise.
Pig
- Index 16 (byte): Saddled.
1
if the pig is wearing a saddle,0
otherwise.
Sheep
- 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 |
Wolf
- 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 | Aggressive (red eyes) |
2 | 0x04 | Tamed |
Objects
Objects are spawned via 0x17 Add Object/Vehicle
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
Players are spawned via 0x14 Named Entity Spawn. They have dimensions 0.6 * 1.8.
Pickups are spawned via 0x15 Pickup Spawn. They have dimensions 0.25 * 0.25.