public static void BuildMovementUpdate(ref RealmPacketOut packet, ObjectBase obj) { uint transportFlags = 0x00; // flags2 //uint flags2 = (m_obj.Transport != null) ? 0x00000200 : 0x00000000; UpdateFlag flags = obj.UpdateFlags; packet.WriteByte((byte)flags); #region UpdateFlag.Living if (HasUpdateFlag(flags, UpdateFlag.Living)) // 0x20 { if (obj.ObjectTypeId == ObjectTypeIds.Unit) { switch (obj.Entry) { case 6491: // Spirit Healer case 13116: // Alliance Spirit Guide case 13117: // Horde Spirit Guide transportFlags |= 0x10000000; break; } } packet.Write(transportFlags); packet.WriteDateTime(DateTime.Now); // this appears to be time in ms but can be any thing } #endregion #region UpdateFlag.HasPosition if (HasUpdateFlag(flags, UpdateFlag.HasPosition)) // 0x40 { if (HasUpdateFlag(flags, UpdateFlag.Transport)) // 0x2 { packet.Write(0.0f); packet.Write(0.0f); packet.Write(0.0f); packet.Write(obj.Orientation); } else { packet.Write(obj.PositionX); packet.Write(obj.PositionY); packet.Write(obj.PositionZ); packet.Write(obj.Orientation); } // transport flag if ((transportFlags & 0x0200) != 0) { // i'm on a transport //*data << (uint64)((Player*)this)->GetTransport()->GetGUID(); //*data << (float)((Player*)this)->GetTransOffsetX(); //*data << (float)((Player*)this)->GetTransOffsetY(); //*data << (float)((Player*)this)->GetTransOffsetZ(); //*data << (float)((Player*)this)->GetTransOffsetO(); //*data << uint32(0x11); //unk, was added in 2.0.3 } } #endregion #region UpdateFlag.Living if (HasUpdateFlag(flags, UpdateFlag.Living)) // 0x20 { packet.Write(0); // unknown Unit thisunit = (Unit)obj; packet.Write(thisunit.WalkSpeed); packet.Write(thisunit.SwimSpeed); packet.Write(thisunit.SwimBackSpeed); packet.Write(thisunit.WalkBackSpeed); packet.Write(thisunit.FlightSpeed); packet.Write(thisunit.FlightBackSpeed); packet.Write(thisunit.TurnSpeed); } #endregion #region UpdateFlag.All if (HasUpdateFlag(flags, UpdateFlag.All)) // 0x10 { packet.Write(1); // looks like flags (0x0, 0x1, 0x100, 0x20000, 0x40000) } #endregion #region UpdateFlag.HighGUID if (HasUpdateFlag(flags, UpdateFlag.HighGUID)) // 0x8 { packet.Write(obj.EntityId.High); // 2.0.6 - high guid was there, unk for 2.0.12 } #endregion #region UpdateFlag.FullGUID if (HasUpdateFlag(flags, UpdateFlag.FullGUID)) // 0x4 { // unused in mangos } #endregion #region UpdateFlag.Transport if (HasUpdateFlag(flags, UpdateFlag.Transport)) // 0x2 { packet.WriteDateTime(DateTime.Now); } #endregion } private static bool HasUpdateFlag(UpdateFlag flags, UpdateFlag toTest) { return (flags & toTest) != 0; }