imported>Jailout2000 |
imported>Kashike |
| (76 intermediate revisions by 23 users not shown) |
| Line 1: |
Line 1: |
| | | #REDIRECT [[Entity metadata]] |
| == Entity Metadata Format ==
| |
| | |
| Note that entity metadata is a totally distinct concept from block metadata.
| |
| | |
| 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 bits (0x1F) serve as an identifier (key) for the data to follow.
| |
| The top 3 bits (0xE0) serve as [[Protocol#Data_Types|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 bits
| |
| 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, byte: 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, int: 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.
| |
| | |
| | |
| === Index 12, int: Animals ===
| |
| | |
| 0 for ordinary animals.
| |
| | |
| Baby animals have the value 0xFFFFA241.
| |
| | |
| == Mobs ==
| |
| | |
| Mobs are spawned via [[Protocol#Mob_Spawn_.280x18.29|0x18 Mob Spawn]]
| |
| | |
| {| 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="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" | Light Blue
| |
| |- class="row5"
| |
| | class="col0" | 4
| |
| | class="col1" | Yellow
| |
| |- 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
| |
| | 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
| |
| |}
| |
| | |
| ==== Wolf ====
| |
| | |
| * <div class="li">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" | Aggressive (red eyes)
| |
| |- class="row3"
| |
| | class="col0" | 2
| |
| | class="col1" | 0x04
| |
| | class="col2" | Tamed
| |
| |}
| |
| | |
| == Objects ==
| |
| | |
| Objects are spawned via [[Protocol#Add_Object.2FVehicle_.280x17.29|0x17 Add Object/Vehicle]]
| |
| | |
| {| class="wikitable"
| |
| |- class="row0"
| |
| ! class="col0" | ID
| |
| ! class="col1" | Name
| |
| ! class="col2" | x, z
| |
| ! class="col3" | y
| |
| |- 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" | 51
| |
| | class="col1" | EnderCrystal
| |
| | class="col2" | 1.25?
| |
| | class="col3" | 2.25?
| |
| |- class="row7"
| |
| | class="col0" | 60
| |
| | class="col1" | Arrow (projectile)
| |
| | class="col2" | 0.5
| |
| | class="col3" | 0.5
| |
| |- class="row8"
| |
| | class="col0" | 61
| |
| | class="col1" | Snowball (projectile)
| |
| | class="col2" | 0.25
| |
| | class="col3" | 0.25
| |
| |- class="row9"
| |
| | class="col0" | 62
| |
| | class="col1" | Egg (projectile)
| |
| | class="col2" | 0.25
| |
| | class="col3" | 0.25
| |
| |- class="row10"
| |
| | class="col0" | 70
| |
| | class="col1" | Falling Sand
| |
| | class="col2" | 0.98
| |
| | class="col3" | 0.98
| |
| |- class="row11"
| |
| | class="col0" | 71
| |
| | class="col1" | Falling Gravel
| |
| | class="col2" | 0.98
| |
| | class="col3" | 0.98
| |
| |- class="row12"
| |
| | class="col0" | 90
| |
| | class="col1" | Fishing Float
| |
| | class="col2" | 0.25?
| |
| | class="col3" | 0.25?
| |
| |}
| |
| | |
| == Other ==
| |
| | |
| Players are spawned via [[Protocol#Named_Entity_Spawn_.280x14.29|0x14 Named Entity Spawn]]. They have dimensions 0.6 * 1.8.
| |
| | |
| Pickups are spawned via [[Protocol#Pickup_Spawn_.280x15.29|0x15 Pickup Spawn]]. They have dimensions 0.25 * 0.25.
| |