imported>Thinkofdeath |
imported>Kashike |
| (22 intermediate revisions by 6 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. All entities '''must''' send at least one item of metadata, in most cases this will be the health item.
| |
| | |
| 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
| |
| | [[Slot Data|slot]]
| |
| |-
| |
| | 6
| |
| | int, int, int (x, y, z)
| |
| |}
| |
| | |
| <nowiki>*</nowiki>Not currently used
| |
| | |
| | |
| In C-like psuedocode:
| |
| <source lang="c">
| |
| do {
| |
| item = readByte();
| |
| if (item == 0x7F) break;
| |
| var index = item & 0x1F;
| |
| var type = item >> 5;
| |
|
| |
| if (type == 0) metadata[index] = readByte();
| |
| if (type == 1) metadata[index] = readShort();
| |
| if (type == 2) metadata[index] = readInt();
| |
| if (type == 3) metadata[index] = readFloat();
| |
| if (type == 4) metadata[index] = readString16();
| |
| if (type == 5) metadata[index] = readSlot();
| |
| if (type == 6) {
| |
| var vector;
| |
| vector.x = readInt();
| |
| vector.y = readInt();
| |
| vector.z = readInt();
| |
| metadata[index] = vector;
| |
| }
| |
| } while (true);
| |
| </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?)
| |
| |- class="row5"
| |
| | class="col0" | 5
| |
| | class="col1" | 0x20
| |
| | class="col2" | Invisible
| |
| |}
| |
| | |
| === 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 5, string: Name ===
| |
| | |
| The string to display on the nameplate, if shown.
| |
| | |
| === Index 6, byte: Show name ===
| |
| | |
| If 1, the nameplate will be displayed over the entity.
| |
| | |
| === 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 ===
| |
| | |
| ==== Player ====
| |
| | |
| * Index '''10''' (byte): Number of arrows sticking into the player
| |
| | |
| ==== 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 '''12''' (int): Same as index 12 of Animals, except that when the baby villager becomes a parent, no countdown starts.
| |
| * Index '''16''' (int): Profession of villager, as according to [http://www.minecraftwiki.net/wiki/Villager#Professions this].
| |
| | |
| ==== Iron Golem ====
| |
| | |
| * Index '''16''' (byte): 0 or 1. Indicates whether the iron golem was spawned by natural means (0) or by a player constructing it (1).
| |
| | |
| == Objects ==
| |
| | |
| Objects are spawned via [[Protocol#0x17|0x17 Spawn Object/Vehicle]]. See [[Object Data]] for more details.
| |
| | |
| {| 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="row1"
| |
| | class="col0" | 2
| |
| | class="col1" | Item Stack ([[Slot]])
| |
| | class="col2" | 0.5
| |
| | class="col3" | 0.5
| |
| |- 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
| |
| | class="col2" | 0.98
| |
| | class="col3" | 0.98
| |
| |- class="row12"
| |
| | class="col0" | 71
| |
| | class="col1" | Item frames
| |
| | class="col2" | ?
| |
| | class="col3" | ?
| |
| |- 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): Minecart shaking (When punched). Initialized to 0. Higher number gives a higher shaking.
| |
| * Index '''18''' (int): Unknown. Initialized to 1
| |
| * Index '''19''' (int): Damage taken. The cart breaks when this is over 40.
| |
| * Index '''20''' (int): Block ID and metadata (upper 16 bits: metadata; lower 16: block ID)
| |
| * Index '''21''' (int): Block Y position (default: 6)
| |
| * Index '''22''' (byte): Show block (1: true; 0: false)
| |
| | |
| ==== Boat ====
| |
| | |
| * Index '''17''' (int): Time since last hit
| |
| * Index '''18''' (int): "Forward direction". Initialized to 1.
| |
| * Index '''19''' (int): Damage taken.
| |
| | |
| ==== Item Stack ([[Slot]]) ====
| |
| | |
| * Index '''10''' (slot): Item stack ([[Slot]])
| |
| | |
| ==== Item Frame ====
| |
| | |
| * Index '''2''' (slot): Item stack ([[Slot]])
| |
| * Index '''3''' (byte): Orientation (0-3, increments of 90 degrees)
| |
| | |
| == Other ==
| |
| | |
| Players are spawned via [[Protocol#0x14|0x14 Named Entity Spawn]]. They have dimensions 0.6 * 1.8.
| |
| | |
| Paintings are spawned via [[Protocol#0x19|0x19 Entity: Painting]]. Their dimensions depend on their type.
| |