void PacketBuilder::WriteMonsterMove(const MoveSpline& moveSpline, WorldPacket& data, Unit* unit) { ObjectGuid guid = unit->GetGUID(); ObjectGuid transport = unit->GetTransGUID(); MonsterMoveType type = GetMonsterMoveType(moveSpline); G3D::Vector3 const& firstPoint = moveSpline.spline.getPoint(moveSpline.spline.first()); data << float(firstPoint.z); data << float(firstPoint.x); data << uint32(moveSpline.GetId()); data << float(firstPoint.y); data << float(0.f); // Most likely transport Y data << float(0.f); // Most likely transport Z data << float(0.f); // Most likely transport X data.WriteBit(1); // Parabolic speed // esi+4Ch data.WriteBit(guid[0]); data.WriteBits(type, 3); if (type == MonsterMoveFacingTarget) { ObjectGuid targetGuid = moveSpline.facing.target; data.WriteGuidMask(targetGuid, 6, 4, 3, 0, 5, 7, 1, 2); } data.WriteBit(1); data.WriteBit(1); data.WriteBit(1); uint32 uncompressedSplineCount = moveSpline.splineflags & MoveSplineFlag::UncompressedPath ? moveSpline.splineflags.cyclic ? moveSpline.spline.getPointCount() - 3 : moveSpline.spline.getPointCount() - 2 : 1; data.WriteBits(uncompressedSplineCount, 20); data.WriteBit(!moveSpline.splineflags.raw()); data.WriteBit(guid[3]); data.WriteBit(1); data.WriteBit(1); data.WriteBit(1); data.WriteBit(!moveSpline.Duration()); data.WriteGuidMask(guid, 7, 4); data.WriteBit(1); data.WriteBit(guid[5]); int32 compressedSplineCount = moveSpline.splineflags & MoveSplineFlag::UncompressedPath ? 0 : moveSpline.spline.getPointCount() - 3; data.WriteBits(compressedSplineCount, 22); // WP count data.WriteBit(guid[6]); data.WriteBit(0); // Fake bit data.WriteGuidMask(transport, 7, 1, 3, 0, 6, 4, 5, 2); data.WriteBit(0); // Send no block data.WriteBit(0); data.WriteGuidMask(guid, 2, 1); data.FlushBits(); if (compressedSplineCount) WriteLinearPath(moveSpline.spline, data); data.WriteByteSeq(guid[1]); data.WriteGuidBytes(transport, 6, 4, 1, 7, 0, 3, 5, 2); if (moveSpline.splineflags & MoveSplineFlag::UncompressedPath) { if (moveSpline.splineflags.cyclic) WriteUncompressedCyclicPath(moveSpline.spline, data); else WriteUncompressedPath(moveSpline.spline, data); } else { G3D::Vector3 const& point = moveSpline.spline.getPoint(moveSpline.spline.getPointCount() - 2); data << point.y << point.x << point.z; } if (type == MonsterMoveFacingTarget) { ObjectGuid targetGuid = moveSpline.facing.target; data.WriteGuidBytes(targetGuid, 5, 7, 0, 4, 3, 2, 6, 1); } data.WriteByteSeq(guid[5]); if (type == MonsterMoveFacingAngle) data << float(moveSpline.facing.angle); data.WriteByteSeq(guid[3]); if (moveSpline.splineflags.raw()) data << uint32(moveSpline.splineflags.raw()); data.WriteByteSeq(guid[6]); if (type == MonsterMoveFacingPoint) data << moveSpline.facing.f.x << moveSpline.facing.f.y << moveSpline.facing.f.z; data.WriteGuidBytes(guid, 0, 7, 2, 4); if (moveSpline.Duration()) data << uint32(moveSpline.Duration()); }