public static void BuildMovementUpdate(ref RealmPacketOut packet, ObjectBase obj) { uint flags2 = 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 flags2 |= 0x10000000; break; } } packet.Write(flags2); 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 ((flags2 & 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; } [Flags] public enum UpdateFlag : byte { Self = 0x01, Transport = 0x02, FullGUID = 0x04, HighGUID = 0x08, All = 0x10, Living = 0x20, HasPosition = 0x40, } public void WriteToPacket(RealmPacketOut packet) { packet.WriteByte((byte)UpdateTypes.Movement); packet.Write(m_obj.EntityId.Full); BuildMovementUpdate(packet, m_obj); }