rendered paste bodypublic 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);
}