Entities: Difference between revisions

From wiki.vg
Jump to navigation Jump to search
imported>Greatman
No edit summary
imported>Kashike
(Kashike moved page Entities to Entity metadata: Separating statuses to their own page, renaming existing page to be specific to metadata)
 
(26 intermediate revisions by 8 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 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 '''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.
 
==== 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.
 
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.

Latest revision as of 02:04, 13 November 2017

Redirect to: