All pastes #466453 Raw Edit

Stuff

public text v1 · immutable
·published 2007-05-01 00:04 UTC
rendered paste body
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;
        }