Entities: Difference between revisions

From wiki.vg
Jump to navigation Jump to search
imported>Jailout2000
m (→‎Objects: Added EnderCrystal)
imported>Kashike
(Kashike moved page Entities to Entity metadata: Separating statuses to their own page, renaming existing page to be specific to metadata)
 
(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.

Latest revision as of 02:04, 13 November 2017

Redirect to: