imported>Md 5 |
imported>Kashike |
| (42 intermediate revisions by 12 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:
| |
| | |
| # Read an unsigned byte
| |
| # If this byte == 127, stop reading
| |
| # Decompose the byte. <br> The bottom 5 bits (0x1F) serve as an identifier (key) for the data to follow. <br> The top 3 bits (0xE0) serve as a type.
| |
| # Read and unpack based on the type (below)
| |
| | |
| {| class="wikitable"
| |
| |-
| |
| ! Type
| |
| ! Meaning
| |
| |-
| |
| | 0
| |
| | byte
| |
| |-
| |
| | 1
| |
| | short
| |
| |-
| |
| | 2
| |
| | int
| |
| |-
| |
| | 3
| |
| | float<sup>*</sup>
| |
| |-
| |
| | 4
| |
| | string16
| |
| |-
| |
| | 5
| |
| | short, byte, short, short sized byte array - if first short is less than 0, no further data is sent.
| |
| |-
| |
| | 6
| |
| | int, int, int (x, y, z)<sup>*</sup>
| |
| |}
| |
| | |
| <nowiki>*</nowiki>Not currently used (last checked in 1.3.1 [http://gist.github.com/0a1062c3b5c2d268f7e9])
| |
| | |
| | |
| In Python-like code:
| |
| <source lang="python">
| |
| #socket is positioned at the beginning of the metadata array. Also note that the method unpack() doesn't exist in socket
| |
| 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')
| |
| if val["id"] != -1:
| |
| val["count"] = socket.unpack('byte')
| |
| val["damage"] = socket.unpack('short')
| |
| val["nbtLength"] = socket.unpack('short')
| |
| if val["nbtLength"] > 0:
| |
| val["nbt"] = socket.unpack(val["nbtLength"])
| |
| if ty == 6:
| |
| val = []
| |
| for i in range(3):
| |
| val.append(socket.unpack('int'))
| |
| metadata[index] = (ty, val)
| |
| x = socket.unpack('byte')
| |
| return metadata
| |
| </source>
| |
| | |
| == 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/Blocking (any right click action?)
| |
| |}
| |
| | |
| === Index 1, short: Drowning counter ===
| |
| | |
| Initialized to <code>300</code> on entity spawn. When underwater, this is decremented by 3 every tick (and sent S->C with [[Protocol#0x28|Entity Metadata (0x28)]]). If the value dips below -19, an [[Protocol#0x26|Entity Status (0x26)]] is sent (i.e. the entity is hurt) and counter is reset to 0.
| |
| | |
| Seems to be sent for *at least* all mobs. Not sure about players.
| |
| | |
| === 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 bytes, 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 -23999. This corresponds to the number of ticks in a minecraft day, which is how long it takes for a baby animal to "grow up". It is therefore considered likely that this field determines the size of the animal, and that Entity Metadata will update it as the animal grows.
| |
| | |
| When an animal becomes a parent this value is set to 6000 and is then decreased over time. Probably a countdown until they can have a new baby.
| |
| | |
| == Mobs ==
| |
| | |
| Mobs are spawned via [[Protocol#0x18|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="row14"
| |
| | class="col0" | 64
| |
| | class="col1" | Wither
| |
| | class="col2" |
| |
| | class="col3" |
| |
| |- class="row15"
| |
| | class="col0" | 65
| |
| | class="col1" | Bat
| |
| | class="col2" |
| |
| | class="col3" |
| |
| |- class="row16"
| |
| | class="col0" | 66
| |
| | class="col1" | Witch
| |
| | class="col2" |
| |
| | class="col3" |
| |
| |- class="row17"
| |
| | class="col0" | 90
| |
| | class="col1" | Pig
| |
| | class="col2" | 0.9
| |
| | class="col3" | 0.9
| |
| |- class="row18"
| |
| | class="col0" | 91
| |
| | class="col1" | Sheep
| |
| | class="col2" | 0.6
| |
| | class="col3" | 1.3
| |
| |- class="row19"
| |
| | class="col0" | 92
| |
| | class="col1" | Cow
| |
| | class="col2" | 0.9
| |
| | class="col3" | 1.3
| |
| |- class="row20"
| |
| | class="col0" | 93
| |
| | class="col1" | Chicken
| |
| | class="col2" | 0.3
| |
| | class="col3" | 0.4
| |
| |- class="row21"
| |
| | class="col0" | 94
| |
| | class="col1" | Squid
| |
| | class="col2" | 0.95
| |
| | class="col3" | 0.95
| |
| |- class="row22"
| |
| | class="col0" | 95
| |
| | class="col1" | Wolf
| |
| | class="col2" | 0.6
| |
| | class="col3" | 1.8
| |
| |- class="row23"
| |
| | class="col0" | 96
| |
| | class="col1" | Mooshroom
| |
| | class="col2" |
| |
| | class="col3" |
| |
| |- class="row24"
| |
| | class="col0" | 97
| |
| | class="col1" | Snowman
| |
| | class="col2" |
| |
| | class="col3" |
| |
| |- class="row25"
| |
| | class="col0" | 98
| |
| | class="col1" | Ocelot
| |
| | class="col2" |
| |
| | class="col3" |
| |
| |- class="row26"
| |
| | class="col0" | 99
| |
| | class="col1" | Iron Golem
| |
| | class="col2" |
| |
| | class="col3" |
| |
| |- class="row27"
| |
| | class="col0" | 120
| |
| | class="col1" | Villager
| |
| | class="col2" |
| |
| | class="col3" |
| |
| |}
| |
| | |
| === Extra Metadata ===
| |
| | |
| ==== Creeper ====
| |
| | |
| * Index '''16''' (byte): Status. Depends on the fuse, values from -1 to 1
| |
| * Index '''17''' (byte): Charged. <code>1</code> if the creeper has been hit by lightning, <code>0</code> otherwise.
| |
| | |
| ==== Spider / Cave Spider ====
| |
| | |
| * Index '''16''' (byte): Unknown, Values 0 and 1. Possibly aggression.
| |
| | |
| ==== 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): Item metadata
| |
| * Index '''18''' (byte): Aggression. <code>1</code> for aggressive, <code>0</code> otherwise.
| |
| | |
| ==== Blaze ====
| |
| | |
| * Index '''16''' (byte): Attacking. <code>1</code> sets the blaze on fire, and shortly after it will attack. <code>0</code> signals the end of the attack.#
| |
| | |
| ==== Ender Dragon ====
| |
| | |
| * Index '''16''' (short): Health. Full health = <code>200</code>
| |
| | |
| ==== 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. Values from 8 to 0
| |
| * Index '''19''' (byte): Unknown, either 0 or 1
| |
| | |
| {| 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
| |
| |}
| |
| | |
| ==== Ocelot ====
| |
| | |
| * Index '''16''' (byte): Flags. Same as Wolf but without the Agressive flag.
| |
| * Index '''17''' (string): Name of player that tamed the ocelot.
| |
| * Index '''18''' (byte): Skin: 0 - ocelot, 3 - tamed cat, probably 1 and 2 too.
| |
| | |
| | |
| ==== Villager ====
| |
| | |
| * Index '''16''' (int): Unknown, example: 0
| |
| | |
| | |
| ==== Iron Golem ====
| |
| | |
| * Index '''16''' (byte): Unknown, example: 1
| |
| | |
| == Objects ==
| |
| | |
| Objects are spawned via [[Protocol#0x17|0x17 Spawn 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" | 65
| |
| | class="col1" | Thrown Enderpearl
| |
| | class="col2" |
| |
| | class="col3" |
| |
| |- class="row11"
| |
| | class="col0" | 66
| |
| | class="col1" | Wither Skull
| |
| | class="col2" |
| |
| | class="col3" |
| |
| |- class="row12"
| |
| | class="col0" | 70
| |
| | class="col1" | Falling Objects - The object data field specifies the block id. in vanilla only used to spawn falling sand/falling gravel/falling dragon eggs
| |
| | class="col2" | 0.98
| |
| | class="col3" | 0.98
| |
| |- class="row13"
| |
| | class="col0" | 72
| |
| | class="col1" | Eye of Ender
| |
| | class="col2" |
| |
| | class="col3" |
| |
| |- class="row14"
| |
| | class="col0" | 73
| |
| | class="col1" | Thrown Potion
| |
| | class="col2" |
| |
| | class="col3" |
| |
| |- class="row15"
| |
| | class="col0" | 74
| |
| | class="col1" | Falling Dragon Egg
| |
| | class="col2" | 0.98
| |
| | class="col3" | 0.98
| |
| |- class="row16"
| |
| | class="col0" | 75
| |
| | class="col1" | Thrown Exp Bottle
| |
| | class="col2" |
| |
| | class="col3" |
| |
| |- class="row17"
| |
| | class="col0" | 90
| |
| | class="col1" | Fishing Float
| |
| | class="col2" | 0.25?
| |
| | class="col3" | 0.25?
| |
| |}
| |
| | |
| === Extra metadata ===
| |
| | |
| ==== Arrow ====
| |
| | |
| * Index '''16''' (byte): Unknown, either 0 or 1
| |
| | |
| ==== Minecart ====
| |
| | |
| * Index '''16''' (byte): Bitfield for flags, but the only known value is 1 if the minecart is powered and has fuel.
| |
| * Index '''17''' (int): Unknown. Initialized to 0
| |
| * Index '''18''' (int): Unknown. Initialized to 1
| |
| * Index '''19''' (int): Damage taken. The cart breaks when this is over 40.
| |
| | |
| ==== Boat ====
| |
| | |
| * Index '''17''' (int): Time since last hit
| |
| * Index '''18''' (int): "Forward direction". Initialized to 1.
| |
| * Index '''19''' (int): Damage taken.
| |
| | |
| == Other ==
| |
| | |
| Players are spawned via [[Protocol#0x14|0x14 Named Entity Spawn]]. They have dimensions 0.6 * 1.8.
| |
| | |
| Pickups are spawned via [[Protocol#0x15|0x15 Pickup Spawn]]. They have dimensions 0.25 * 0.25.
| |
| | |
| Paintings are spawned via [[Protocol#0x19|0x19 Entity: Painting]]. Their dimensions depend on their type.
| |