public LLLoginResponse(UserAccount account, AgentCircuitData aCircuit, Framework.Services.UserInfo pinfo,
                               GridRegion destination, List <InventoryFolderBase> invSkel, FriendInfo[] friendsList,
                               IInventoryService invService, ILibraryService libService,
                               string where, string startlocation, Vector3 position, Vector3 lookAt,
                               List <InventoryItemBase> gestures,
                               GridRegion home, IPEndPoint clientIP, string AdultMax, string AdultRating,
                               ArrayList eventValues, ArrayList eventNotificationValues, ArrayList classifiedValues,
                               string seedCap, IConfigSource source,
                               string DisplayName, string cofversion, IGridInfo info)
            : this()
        {
            m_source       = source;
            m_gridInfo     = info;
            SeedCapability = seedCap;

            FillOutInventoryData(invSkel, libService, invService);

            FillOutActiveGestures(gestures);

            CircuitCode          = (int)aCircuit.CircuitCode;
            Lastname             = account.LastName;
            Firstname            = account.FirstName;
            this.DisplayName     = DisplayName;
            AgentID              = account.PrincipalID;
            SessionID            = aCircuit.SessionID;
            SecureSessionID      = aCircuit.SecureSessionID;
            BuddList             = ConvertFriendListItem(friendsList);
            StartLocation        = where;
            AgentAccessMax       = AdultMax;
            AgentAccess          = AdultRating;
            AgentRegionAccess    = AgentRegionAccess;
            AOTransition         = AOTransition;
            AgentFlag            = AgentFlag;
            eventCategories      = eventValues;
            eventNotifications   = eventNotificationValues;
            classifiedCategories = classifiedValues;
            COFVersion           = cofversion;

            FillOutHomeData(pinfo, home);
            LookAt = string.Format("[r{0},r{1},r{2}]", lookAt.X, lookAt.Y, lookAt.Z);

            FillOutRegionData(aCircuit, destination);
            login        = "******";
            ErrorMessage = "";
            ErrorReason  = LoginResponseEnum.OK;
        }
        private void FillOutHomeData(Framework.Services.UserInfo pinfo, GridRegion home)
        {
            int x = 1000 * Constants.RegionSize, y = 1000 * Constants.RegionSize;

            if (home != null)
            {
                x = home.RegionLocX;
                y = home.RegionLocY;
            }

            Home = string.Format(
                "{{'region_handle':[r{0},r{1}], 'position':[r{2},r{3},r{4}], 'look_at':[r{5},r{6},r{7}]}}",
                x,
                y,
                pinfo.HomePosition.X, pinfo.HomePosition.Y, pinfo.HomePosition.Z,
                pinfo.HomeLookAt.X, pinfo.HomeLookAt.Y, pinfo.HomeLookAt.Z);
        }
        void FillOutHomeData(Framework.Services.UserInfo pinfo, GridRegion homeRegion)
        {
            // TODO: The region start positions should be retrieved from the SimulationBase MapCenterX/MapCenterY
            // This is a fallback setting as the user's home region should have been set on login
            int x = Constants.DEFAULT_REGIONSTART_X * Constants.RegionSize;
            int y = Constants.DEFAULT_REGIONSTART_Y * Constants.RegionSize;

            if (homeRegion != null)
            {
                x = homeRegion.RegionLocX;
                y = homeRegion.RegionLocY;
            }

            Home = string.Format(
                "{{'region_handle':[r{0},r{1}], 'position':[r{2},r{3},r{4}], 'look_at':[r{5},r{6},r{7}]}}",
                x,
                y,
                pinfo.HomePosition.X, pinfo.HomePosition.Y, pinfo.HomePosition.Z,
                pinfo.HomeLookAt.X, pinfo.HomeLookAt.Y, pinfo.HomeLookAt.Z);
        }