Skip to content
This repository was archived by the owner on Jul 17, 2022. It is now read-only.

SMSG_UPDATE_OBJECT

Sergio edited this page Feb 21, 2020 · 20 revisions

Intro

This is world packet which can be used for spawning new or changing existing objects.


General structure

In general, it has next structure:

SMSG_UPDATE_OBJECT structure



Batch structure

Each batch in turn has next structure:


batch structure


Update Type

update_type here may take next values:

VALUES                   = 0
MOVEMENT                 = 1
CREATE_OBJECT            = 2    # for entities without position: item, bag etc
CREATE_OBJECT2           = 3    # for entities with position in space: gameobjects, corpses, creatures, players etc
OUT_OF_RANGE_OBJECTS     = 4
NEAR_OBJECTS             = 5

Guid

guid contains of mask and guid. When you send unpacked guid you also send 0xff mask (already implemented). Otherwise, packed guid already includes needed mask.

Object Type

object_type may take next values:

OBJECT          = 0  # 0x01 (object)
ITEM            = 1  # 0x03 (object, item)
CONTAINER       = 2  # 0x07 (object, item, container)
UNIT            = 3  # 0x09 (object, unit)
PLAYER          = 4  # 0x19 (object, unit, player)
GAME_OBJECT     = 5  # 0x21 (object, game_object)
DYNAMIC_OBJECT  = 6  # 0x41 (object, dynamic_object)
CORPSE          = 7  # 0x81 (object, corpse)


Movement Data

Movement data contains of next parts:

Movement data structure

Update Flags
UPDATEFLAG_NONE                     = 0x0000
UPDATEFLAG_SELF                     = 0x0001
UPDATEFLAG_TRANSPORT                = 0x0002
UPDATEFLAG_HAS_ATTACKING_TARGET     = 0x0004
UPDATEFLAG_LOWGUID                  = 0x0008
UPDATEFLAG_HIGHGUID                 = 0x0010
UPDATEFLAG_LIVING                   = 0x0020
UPDATEFLAG_HAS_POSITION             = 0x0040


Movement Flags

Movement flags contains of next values:

NONE               = 0x00000000
FORWARD            = 0x00000001
BACKWARD           = 0x00000002
STRAFE_LEFT        = 0x00000004
STRAFE_RIGHT       = 0x00000008
TURN_LEFT          = 0x00000010
TURN_RIGHT         = 0x00000020
PITCH_UP           = 0x00000040
PITCH_DOWN         = 0x00000080
WALK_MODE          = 0x00000100        # Walking
ONTRANSPORT        = 0x00000200        # Used for flying on some creatures
LEVITATING         = 0x00000400
ROOT               = 0x00000800
FALLING            = 0x00001000
FALLINGFAR         = 0x00004000
SWIMMING           = 0x00200000        # appears with fly flag also
ASCENDING          = 0x00400000        # swim up also
CAN_FLY            = 0x00800000
FLYING             = 0x01000000
FLYING2            = 0x02000000        # Actual flying mode
SPLINE_ELEVATION   = 0x04000000        # used for flight paths
SPLINE_ENABLED     = 0x08000000        # used for flight paths
WATERWALKING       = 0x10000000        # prevent unit from falling through water
SAFE_FALL          = 0x20000000        # active rogue safe fall spell (passive)
HOVER              = 0x40000000


Builder data

Builder data contains of number of mask blocks, mask blocks and update data. UpdateBlocksBuilder builds this part depend on update object fields list.

Examples

  1. You want to spawn player. You need:
  • player spawn fields. Currently in project uses next fields:
# Object fields
ObjectField.GUID,
ObjectField.TYPE,
ObjectField.SCALE_X,

# Unit fields
UnitField.HEALTH,
UnitField.MAXHEALTH,
UnitField.LEVEL,
UnitField.FACTIONTEMPLATE,
UnitField.BYTES_0,
UnitField.FLAGS,
UnitField.BOUNDINGRADIUS,
UnitField.COMBATREACH,
UnitField.DISPLAYID,
UnitField.NATIVEDISPLAYID,
UnitField.STAT0,
UnitField.STAT1,
UnitField.STAT2,
UnitField.STAT3,
UnitField.STAT4,
UnitField.RESISTANCE_NORMAL,
UnitField.BASE_HEALTH,

# Player fields
PlayerField.FLAGS,
PlayerField.BYTES_1,
PlayerField.BYTES_2,

PlayerField.VISIBLE_ITEM_1_0,
PlayerField.VISIBLE_ITEM_2_0,
PlayerField.VISIBLE_ITEM_3_0,
PlayerField.VISIBLE_ITEM_4_0,
PlayerField.VISIBLE_ITEM_5_0,
PlayerField.VISIBLE_ITEM_6_0,
PlayerField.VISIBLE_ITEM_7_0,
PlayerField.VISIBLE_ITEM_8_0,
PlayerField.VISIBLE_ITEM_9_0,
PlayerField.VISIBLE_ITEM_10_0,
PlayerField.VISIBLE_ITEM_11_0,
PlayerField.VISIBLE_ITEM_12_0,
PlayerField.VISIBLE_ITEM_13_0,
PlayerField.VISIBLE_ITEM_14_0,
PlayerField.VISIBLE_ITEM_15_0,
PlayerField.VISIBLE_ITEM_16_0,
PlayerField.VISIBLE_ITEM_17_0,

PlayerField.INV_SLOT_HEAD,
PlayerField.INV_SLOT_NECK,
PlayerField.INV_SLOT_SHOULDERS,
PlayerField.INV_SLOT_BODY,
PlayerField.INV_SLOT_CHEST,
PlayerField.INV_SLOT_WAIST,
PlayerField.INV_SLOT_LEGS,
PlayerField.INV_SLOT_FEET,
PlayerField.INV_SLOT_WRISTS,
PlayerField.INV_SLOT_HANDS,
PlayerField.INV_SLOT_FINGER1,
PlayerField.INV_SLOT_FINGER2,
PlayerField.INV_SLOT_TRINKET1,
PlayerField.INV_SLOT_TRINKET2,
PlayerField.INV_SLOT_BACK,
PlayerField.INV_SLOT_MAINHAND,
PlayerField.INV_SLOT_OFFHAND,
PlayerField.INV_SLOT_RANGED,
PlayerField.INV_SLOT_TABARD,

PlayerField.XP,
PlayerField.NEXT_LEVEL_XP,
PlayerField.CHARACTER_POINTS1,
PlayerField.CHARACTER_POINTS2,
PlayerField.SHIELD_BLOCK,
PlayerField.EXPLORED_ZONES_1,
PlayerField.MOD_DAMAGE_NORMAL_DONE_PCT,
PlayerField.BYTES,
PlayerField.WATCHED_FACTION_INDEX,
PlayerField.MAX_LEVEL,
PlayerField.COINAGE
  • player's data (loaded from db)
  • as guid we use player's id field.
  • as update_type we use CREATE_OBJECT2
  • as update_flags for movement we use
(
    UpdateObjectFlags.UPDATEFLAG_LIVING.value |
    UpdateObjectFlags.UPDATEFLAG_HAS_POSITION.value |
    UpdateObjectFlags.UPDATEFLAG_HIGHGUID.value |
    UpdateObjectFlags.UPDATEFLAG_SELF.value
)

Data for player spawn fields is builded by special managers (ObjectManager, UnitManager and PlayerManager)

Clone this wiki locally