示例#1
0
        public void Startup(ConfigurationLoader loader)
        {
            HomeURI = loader.HomeURI;

            m_AgentInventoryService = loader.GetService <InventoryServiceInterface>(m_AgentInventoryServiceName);
            m_AgentAssetService     = loader.GetService <AssetServiceInterface>(m_AgentAssetServiceName);
            if (m_AgentProfileServiceName?.Length != 0)
            {
                m_AgentProfileService = loader.GetService <ProfileServiceInterface>(m_AgentProfileServiceName);
            }
            m_AgentFriendsService = loader.GetService <FriendsServiceInterface>(m_AgentFriendsServiceName);
            m_UserSessionService  = loader.GetService <UserSessionServiceInterface>(m_UserSessionServiceName);
            m_GridService         = loader.GetService <GridServiceInterface>(m_GridServiceName);
            if (m_OfflineIMServiceName?.Length != 0)
            {
                m_OfflineIMService = loader.GetService <OfflineIMServiceInterface>(m_OfflineIMServiceName);
            }
            if (m_AgentExperienceServiceName?.Length != 0)
            {
                loader.GetService(m_AgentExperienceServiceName, out m_AgentExperienceService);
            }
            if (m_AgentGroupsServiceName?.Length != 0)
            {
                loader.GetService(m_AgentGroupsServiceName, out m_AgentGroupsService);
            }
            m_UserAccountService    = loader.GetService <UserAccountServiceInterface>(m_UserAccountServiceName);
            m_AgentUserAgentService = new LocalUserAgentService(m_UserSessionService, m_UserAccountService, m_RequiresInventoryIDAsIMSessionID, HomeURI);

            m_Scenes               = loader.Scenes;
            m_Commands             = loader.CommandRegistry;
            m_CapsRedirector       = loader.CapsRedirector;
            m_PacketHandlerPlugins = loader.GetServicesByValue <IProtocolExtender>();
        }
示例#2
0
        public void Startup(ConfigurationLoader loader)
        {
            m_Scenes        = loader.Scenes;
            m_EstateService = loader.GetService <EstateServiceInterface>(m_EstateServiceName);
            m_RegionStorage = loader.GetService <GridServiceInterface>(m_RegionStorageName);
            loader.CommandRegistry.AddShowCommand("estates", ShowEstatesCmd);
            loader.CommandRegistry.AddChangeCommand("estate", ChangeEstateCmd);
            loader.CommandRegistry.AddCreateCommand("estate", CreateEstateCmd);
            loader.CommandRegistry.AddDeleteCommand("estate", DeleteEstateCmd);
            loader.CommandRegistry.AddAlertCommand("estate", AlertEstateCmd);

            var     avatarNameServicesList = new RwLockedList <AvatarNameServiceInterface>();
            IConfig sceneConfig            = loader.Config.Configs["DefaultSceneImplementation"];

            if (sceneConfig != null)
            {
                string avatarNameServices = sceneConfig.GetString("AvatarNameServices", string.Empty);
                if (!string.IsNullOrEmpty(avatarNameServices))
                {
                    foreach (string p in avatarNameServices.Split(','))
                    {
                        avatarNameServicesList.Add(loader.GetService <AvatarNameServiceInterface>(p.Trim()));
                    }
                }
            }
            m_AvatarNameService = new AggregatingAvatarNameService(avatarNameServicesList);
        }
 public RestartObject(SceneList scenes, SceneInterface scene, SceneImplementationFactory sceneFactory, GridServiceInterface regionStorage)
 {
     m_Scenes              = scenes;
     m_WeakScene           = new WeakReference(scene);
     m_SceneFactory        = sceneFactory;
     m_RegionStorage       = regionStorage;
     RestartTimer.Elapsed += RestartTimerHandler;
 }
示例#4
0
 public void Startup(ConfigurationLoader loader)
 {
     m_GatekeeperUri           = loader.GatekeeperURI;
     m_Scenes                  = loader.Scenes;
     m_ExternalHostNameService = loader.ExternalHostNameService;
     m_SceneFactory            = loader.GetService <SceneFactoryInterface>("DefaultSceneImplementation");
     m_RegionService           = loader.GetService <GridServiceInterface>(m_RegionStorage);
 }
示例#5
0
 public void Startup(ConfigurationLoader loader)
 {
     m_GridService = loader.GetService <GridServiceInterface>(m_GridServiceName);
     m_RegionDefaultFlagsService = loader.GetService <RegionDefaultFlagsServiceInterface>(m_RegionDefaultFlagsServiceName);
     loader.CommandRegistry.AddChangeCommand("regionflags", ChangeRegionFlagDefaultsCmd);
     loader.CommandRegistry.AddClearCommand("regionflags", ClearRegionFlagDefaultsCmd);
     loader.CommandRegistry.AddShowCommand("defaultregionflags", ShowRegionFlagDefaultsCmd);
     loader.CommandRegistry.AddUnregisterCommand("gridregion", UnregisterRegionCmd);
     loader.CommandRegistry.AddShowCommand("gridregions", ShowRegionsCmd);
 }
示例#6
0
        public static List <RegionInfo> GetNeighbors(this GridServiceInterface gridService, RegionInfo ownRegion)
        {
            var southWestCorner = ownRegion.Location;
            var northEastCorner = ownRegion.Location + ownRegion.Size;

            var southWestViewCorner = ownRegion.Location;
            var northEastViewCorner = ownRegion.Location + ownRegion.Size;

            southWestViewCorner.X -= MAXIMUM_VIEW_RANGE;
            southWestViewCorner.Y -= MAXIMUM_VIEW_RANGE;
            northEastViewCorner.X += MAXIMUM_VIEW_RANGE;
            northEastViewCorner.Y += MAXIMUM_VIEW_RANGE;

            southWestCorner.X -= MAXIMUM_REGION_SIZE;
            southWestCorner.Y -= MAXIMUM_REGION_SIZE;
            northEastCorner.X += MAXIMUM_VIEW_RANGE;
            northEastCorner.Y += MAXIMUM_VIEW_RANGE;

            var regions         = gridService.GetRegionsByRange(southWestCorner, northEastCorner);
            var actualNeighbors = new List <RegionInfo>();

            foreach (var ri in regions)
            {
                var northEastNeighborCorner = ri.Location + ri.Size;
                if (ownRegion.ID == ri.ID)
                {
                    /* skip we are not our own neighbor */
                }
                // The r.RegionFlags == null check only needs to be made for simulators before 2015-01-14 (pre 0.8.1).
                else if ((ri.Flags & RegionFlags.RegionOnline) == 0)
                {
                    /* skip offline regions */
                }
                else if (northEastNeighborCorner.X < southWestViewCorner.X ||
                         northEastNeighborCorner.Y < southWestViewCorner.Y ||
                         ri.Location.X > northEastViewCorner.X ||
                         ri.Location.Y > northEastViewCorner.Y)
                {
                    /* not a neighbour at all */
                }
                else
                {
                    actualNeighbors.Add(ri);
                }
            }

            return(actualNeighbors);
        }
示例#7
0
 public void Startup(ConfigurationLoader loader)
 {
     m_WebIF = loader.GetAdminWebIF();
     m_RegionDefaultFlagsService = loader.GetService <RegionDefaultFlagsServiceInterface>(m_RegionDefaultFlagsServiceName);
     m_GridService = loader.GetService <GridServiceInterface>(m_GridServiceName);
     m_WebIF.ModuleNames.Add("mapserver");
     m_WebIF.AutoGrantRights["mapserver.unregister"].Add("mapserver.view");
     m_WebIF.AutoGrantRights["mapserver.manage"].Add("mapserver.view");
     m_WebIF.JsonMethods.Add("mapserver.search", HandleMapServerSearch);
     m_WebIF.JsonMethods.Add("mapserver.getdefaultregions", HandleMapServerGetDefaultRegions);
     m_WebIF.JsonMethods.Add("mapserver.getdefaulthgregions", HandleMapServerGetDefaultHGRegions);
     m_WebIF.JsonMethods.Add("mapserver.getfallbackregions", HandleMapServerGetFallbackRegions);
     m_WebIF.JsonMethods.Add("mapserver.unregister", HandleMapServerUnregisterRegion);
     m_WebIF.JsonMethods.Add("mapserver.defaultregionflags.list", HandleMapServerGetDefaultRegionFlags);
     m_WebIF.JsonMethods.Add("mapserver.defaultregionflags.change", HandleMapServerChangeDefaultRegionFlags);
 }
示例#8
0
        public void Startup(ConfigurationLoader loader)
        {
            m_Scenes               = loader.Scenes;
            m_EstateService        = loader.GetService <EstateServiceInterface>(m_EstateServiceName);
            m_RegionStorageService = loader.GetService <GridServiceInterface>(m_RegionStorageName);
            IAdminWebIF webif = loader.GetAdminWebIF();

            m_WebIF = webif;
            webif.ModuleNames.Add("estates");
            webif.JsonMethods.Add("estates.list", HandleList);
            webif.JsonMethods.Add("estate.get", HandleGet);
            webif.JsonMethods.Add("estate.update", HandleUpdate);
            webif.JsonMethods.Add("estate.delete", HandleDelete);
            webif.JsonMethods.Add("estate.create", HandleCreate);
            webif.JsonMethods.Add("estate.notice", HandleNotice);

            webif.AutoGrantRights["estates.manage"].Add("estates.view");
            webif.AutoGrantRights["estate.notice"].Add("estates.view");
        }
        public void Startup(ConfigurationLoader loader)
        {
            m_CommandRegistry           = loader.CommandRegistry;
            m_TeleportProtocols         = loader.GetServicesByValue <ITeleportHandlerFactoryServiceInterface>();
            m_UserSessionStatusServices = loader.GetServicesByValue <IUserSessionStatusHandler>();
            m_Scenes                = loader.Scenes;
            m_CapsRedirector        = loader.CapsRedirector;
            m_AuthorizationServices = loader.GetServicesByValue <AuthorizationServiceInterface>();
            m_HttpServer            = loader.HttpServer;
            m_GridService           = loader.GetService <GridServiceInterface>(m_GridServiceName);
            Commands                = loader.CommandRegistry;
            m_PacketHandlerPlugins  = loader.GetServicesByValue <IProtocolExtender>();
            m_GatekeeperURI         = loader.GatekeeperURI;

            loader.GetService(m_LocalUserAccountServiceName, out m_LocalUserAccountService);
            loader.GetService(m_LocalAssetServiceName, out m_LocalAssetService);
            loader.GetService(m_LocalInventoryServiceName, out m_LocalInventoryService);
            if (!string.IsNullOrEmpty(m_LocalProfileServiceName))
            {
                loader.GetService(m_LocalProfileServiceName, out m_LocalProfileService);
            }
            loader.GetService(m_LocalFriendsServiceName, out m_LocalFriendsService);
            loader.GetService(m_LocalUserSessionServiceName, out m_LocalUserSessionService);
            loader.GetService(m_LocalOfflineIMServiceName, out m_LocalOfflineIMService);
            if (!string.IsNullOrEmpty(m_LocalGroupsServiceName))
            {
                loader.GetService(m_LocalGroupsServiceName, out m_LocalGroupsService);
            }
            if (!string.IsNullOrEmpty(m_LocalExperienceServiceName))
            {
                loader.GetService(m_LocalExperienceServiceName, out m_LocalExperienceService);
            }
            if (!loader.TryGetService(m_LocalEconomyServiceName, out m_LocalEconomyService))
            {
                m_LocalEconomyService = null;
            }
        }
示例#10
0
        public void Startup(ConfigurationLoader loader)
        {
            m_Scenes        = loader.Scenes;
            m_Loader        = loader;
            m_GatekeeperURI = loader.GatekeeperURI;
            IConfig config = loader.Config.Configs[GetType().FullName];

            /* we use same asset id keying here so to make them compatible with the other scripts */
            foreach (string key in config.GetKeys())
            {
                if (UUID.TryParse(key, out m_AssetID))
                {
                    m_ScriptFile = config.GetString(key);
                    break;
                }
            }

            m_ObjectPermissionsBase     = GetPermissions(config, "ObjectPermisionsBase");
            m_ObjectPermissionsOwner    = GetPermissions(config, "ObjectPermisionsOwner");
            m_ObjectPermissionsGroup    = GetPermissions(config, "ObjectPermisionsGroup");
            m_ObjectPermissionsNext     = GetPermissions(config, "ObjectPermisionsNext");
            m_ObjectPermissionsEveryone = GetPermissions(config, "ObjectPermisionsEveryone");

            m_ScriptPermissionsBase     = GetPermissions(config, "ScriptPermisionsBase");
            m_ScriptPermissionsOwner    = GetPermissions(config, "ScriptPermisionsOwner");
            m_ScriptPermissionsGroup    = GetPermissions(config, "ScriptPermisionsGroup");
            m_ScriptPermissionsNext     = GetPermissions(config, "ScriptPermisionsNext");
            m_ScriptPermissionsEveryone = GetPermissions(config, "ScriptPermisionsEveryone");

            m_LoadOarFileName = config.GetString("OarFilename", string.Empty);

            m_TimeoutMs   = config.GetInt("RunTimeout", 1000);
            m_RegionID    = UUID.Parse(config.GetString("RegionID"));
            m_RegionOwner = new UGUIWithName(config.GetString("RegionOwner"))
            {
                IsAuthoritative = true
            };
            m_EstateOwner = new UGUIWithName(config.GetString("EstateOwner", m_RegionOwner.ToString()))
            {
                IsAuthoritative = true
            };
            m_EstateID   = (uint)config.GetInt("EstateID", 100);
            m_EstateName = config.GetString("EstateName", "My Estate");

            m_ObjectID       = UUID.Parse(config.GetString("ID", UUID.Random.ToString()));
            m_RegionName     = config.GetString("RegionName", "Testing Region");
            m_ProductName    = config.GetString("RegionProductName", "Mainland");
            m_RegionLocation = new GridVector(config.GetString("RegionLocation", "10000,10000"), 256);
            m_RegionSize     = new GridVector(config.GetString("RegionSize", "1,1"), 256);
            m_RegionAccess   = (RegionAccess)Enum.Parse(typeof(RegionAccess), config.GetString("RegionAccess", "PG"));
            m_RegionPort     = config.GetInt("RegionPort", 9300);
            m_Runner         = loader.GetServicesByValue <TestRunner>()[0];
            m_Position       = Vector3.Parse(config.GetString("Position", "<128, 128, 23>"));
            m_Rotation       = Quaternion.Parse(config.GetString("Rotation", "<0,0,0,1>"));

            m_ItemID       = UUID.Parse(config.GetString("ScriptItemID", UUID.Random.ToString()));
            m_RezzingObjID = UUID.Parse(config.GetString("RezzingObjectID", UUID.Zero.ToString()));
            m_ObjectName   = config.GetString("ObjectName", "Object");
            m_ScriptName   = config.GetString("ScriptName", "Script");
            string experienceName = config.GetString("ExperienceName", "My Experience");
            UUID   experienceID;

            UUID.TryParse(config.GetString("ExperienceID", UUID.Zero.ToString()), out experienceID);
            m_ExperienceID = new UEI(experienceID, experienceName, null);

            m_ObjectDescription = config.GetString("ObjectDescription", "");
            m_ScriptDescription = config.GetString("ScriptDescription", "");

            m_RegionStorage      = loader.GetService <GridServiceInterface>("RegionStorage");
            m_SceneFactory       = loader.GetService <SceneFactoryInterface>("DefaultSceneImplementation");
            m_EstateService      = loader.GetService <EstateServiceInterface>("EstateService");
            m_AvatarNameService  = loader.GetService <AvatarNameServiceInterface>("AvatarNameStorage");
            m_UserAccountService = loader.GetService <UserAccountServiceInterface>("UserAccountService");

            m_AvatarNameService.Store(m_RegionOwner);
            m_AvatarNameService.Store(m_EstateOwner);
            try
            {
                m_UserAccountService.Add(new UserAccount
                {
                    Principal     = m_RegionOwner,
                    IsLocalToGrid = true,
                });
            }
            catch
            {
                m_Log.Info("UserAccount creation failed for RegionOwner");
            }

            if (!m_EstateOwner.EqualsGrid(m_RegionOwner))
            {
                try
                {
                    m_UserAccountService.Add(new UserAccount
                    {
                        Principal     = m_RegionOwner,
                        IsLocalToGrid = true,
                    });
                }
                catch
                {
                    m_Log.Info("UserAccount creation failed for EstateOwner");
                }
            }

            m_ObjectOwner = new UGUIWithName(config.GetString("ObjectOwner"))
            {
                IsAuthoritative = true
            };
            m_AvatarNameService.Store(m_ObjectOwner);
            if (config.Contains("ObjectCreator"))
            {
                m_ObjectCreator = new UGUIWithName(config.GetString("ObjectCreator"))
                {
                    IsAuthoritative = true
                };
                m_AvatarNameService.Store(m_ObjectCreator);
                try
                {
                    m_UserAccountService.Add(new UserAccount
                    {
                        Principal     = m_ObjectCreator,
                        IsLocalToGrid = true,
                    });
                }
                catch
                {
                    /* intentionally ignored */
                }
            }
            else
            {
                m_ObjectCreator = m_ObjectOwner;
            }
            if (config.Contains("ObjectLastOwner"))
            {
                m_ObjectLastOwner = new UGUIWithName(config.GetString("ObjectLastOwner"))
                {
                    IsAuthoritative = true
                };
                m_AvatarNameService.Store(m_ObjectLastOwner);
                try
                {
                    m_UserAccountService.Add(new UserAccount
                    {
                        Principal     = m_ObjectLastOwner,
                        IsLocalToGrid = true,
                    });
                }
                catch
                {
                    /* intentionally ignored */
                }
            }
            else
            {
                m_ObjectLastOwner = m_ObjectOwner;
            }

            m_ScriptOwner = new UGUIWithName(config.GetString("ScriptOwner"))
            {
                IsAuthoritative = true
            };
            m_AvatarNameService.Store(m_ScriptOwner);
            if (config.Contains("ScriptCreator"))
            {
                m_ScriptCreator = new UGUIWithName(config.GetString("ScriptCreator"))
                {
                    IsAuthoritative = true
                };
                m_AvatarNameService.Store(m_ScriptCreator);
                try
                {
                    m_UserAccountService.Add(new UserAccount
                    {
                        Principal     = m_ScriptCreator,
                        IsLocalToGrid = true,
                    });
                }
                catch
                {
                    /* intentionally ignored */
                }
            }
            else
            {
                m_ScriptCreator = m_ScriptOwner;
            }
            if (config.Contains("ScriptLastOwner"))
            {
                m_ScriptLastOwner = new UGUIWithName(config.GetString("ScriptLastOwner"))
                {
                    IsAuthoritative = true
                };
                m_AvatarNameService.Store(m_ScriptLastOwner);
                try
                {
                    m_UserAccountService.Add(new UserAccount
                    {
                        Principal     = m_ScriptLastOwner,
                        IsLocalToGrid = true,
                    });
                }
                catch
                {
                    /* intentionally ignored */
                }
            }
            else
            {
                m_ScriptLastOwner = m_ScriptOwner;
            }

            m_StartParameter = config.GetInt("StartParameter", 0);

            if (string.IsNullOrEmpty(m_ScriptFile))
            {
                throw new ArgumentException("Script filename and UUID missing");
            }

            m_AdditionalObjectConfigs = config.GetString("AdditionalObjects", string.Empty).Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            if (m_AdditionalObjectConfigs.Length == 1 && m_AdditionalObjectConfigs[0] == string.Empty)
            {
                m_AdditionalObjectConfigs = new string[0];
            }

            m_AdditionalInventoryConfigs = config.GetString("AdditionalInventories", string.Empty).Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            if (m_AdditionalInventoryConfigs.Length == 1 && m_AdditionalInventoryConfigs[0] == string.Empty)
            {
                m_AdditionalInventoryConfigs = new string[0];
            }

            m_AssetSourcesConfig = config.GetString("AssetSources", string.Empty);

            m_ScriptStatesConfig = config.GetString("ScriptStates", string.Empty);

            CompilerRegistry.ScriptCompilers.DefaultCompilerName = config.GetString("DefaultCompiler");
        }
        private void PostAgent_Local(UserAccount account, ClientInfo clientInfo, SessionInfo sessionInfo, DestinationInfo destinationInfo, CircuitInfo circuitInfo, AppearanceInfo appearance, UUID capsId, int maxAllowedWearables, out string capsPath)
        {
            SceneInterface scene;

            if (!m_Scenes.TryGetValue(destinationInfo.ID, out scene))
            {
                throw new LoginFailedException(string.Format("No destination for agent {0}", account.Principal.FullName));
            }

            /* We have established trust of home grid by verifying its agent.
             * At least agent and grid belong together.
             *
             * Now, we can validate the access of the agent.
             */
            var ad = new AuthorizationServiceInterface.AuthorizationData
            {
                ClientInfo      = clientInfo,
                SessionInfo     = sessionInfo,
                AccountInfo     = account,
                DestinationInfo = destinationInfo,
                AppearanceInfo  = appearance
            };

            foreach (AuthorizationServiceInterface authService in m_AuthorizationServices)
            {
                authService.Authorize(ad);
            }

            try
            {
                IAgent sceneAgent = scene.Agents[account.Principal.ID];
                if (sceneAgent.Owner.EqualsGrid(account.Principal))
                {
                    if (circuitInfo.IsChild && !sceneAgent.IsInScene(scene))
                    {
                        /* already got an agent here */
                        m_Log.WarnFormat("Failed to create agent due to duplicate agent id. {0} != {1}", sceneAgent.Owner.ToString(), account.Principal.ToString());
                        throw new LoginFailedException("Failed to create agent due to duplicate agent id");
                    }
                    else if (!circuitInfo.IsChild && !sceneAgent.IsInScene(scene))
                    {
                        /* child becomes root */
                        throw new LoginFailedException("Teleport destination not yet implemented");
                    }
                }
                else if (sceneAgent.Owner.ID == account.Principal.ID)
                {
                    /* we got an agent already and no grid match? */
                    m_Log.WarnFormat("Failed to create agent due to duplicate agent id. {0} != {1}", sceneAgent.Owner.ToString(), account.Principal.ToString());
                    throw new LoginFailedException("Failed to create agent due to duplicate agent id");
                }
            }
            catch
            {
                /* no action needed */
            }

            GridServiceInterface gridService = scene.GridService;

            var serviceList = new AgentServiceList
            {
                m_LocalAssetService,
                m_LocalInventoryService
            };

            if (m_LocalGroupsService != null)
            {
                serviceList.Add(m_LocalGroupsService);
            }
            if (m_LocalExperienceService != null)
            {
                serviceList.Add(m_LocalExperienceService);
            }
            if (m_LocalProfileService != null)
            {
                serviceList.Add(m_LocalProfileService);
            }
            serviceList.Add(m_LocalFriendsService);
            serviceList.Add(new StandalonePresenceService(m_LocalUserAccountService, account.Principal, m_LocalUserSessionService, sessionInfo.SessionID, m_UserSessionStatusServices));
            serviceList.Add(gridService);
            serviceList.Add(m_LocalOfflineIMService);
            if (m_LocalEconomyService != null)
            {
                serviceList.Add(m_LocalEconomyService);
            }
            foreach (ITeleportHandlerFactoryServiceInterface factory in m_TeleportProtocols)
            {
                serviceList.Add(factory.Instantiate(m_CommandRegistry, m_CapsRedirector, m_PacketHandlerPlugins, m_Scenes));
            }

            var agent = new ViewerAgent(
                m_Scenes,
                account.Principal.ID,
                account.Principal.FirstName,
                account.Principal.LastName,
                account.Principal.HomeURI,
                sessionInfo.SessionID,
                sessionInfo.SecureSessionID,
                clientInfo,
                account,
                serviceList)
            {
                ServiceURLs = account.ServiceURLs,

                Appearance = appearance
            };

            try
            {
                scene.DetermineInitialAgentLocation(agent, destinationInfo.TeleportFlags, destinationInfo.Location, destinationInfo.LookAt);
            }
            catch (Exception e)
            {
                m_Log.InfoFormat("Failed to determine initial location for agent {0}: {1}: {2}", account.Principal.FullName, e.GetType().FullName, e.Message);
#if DEBUG
                m_Log.Debug("Exception", e);
#endif
                throw new LoginFailedException(e.Message);
            }

            var udpServer = (UDPCircuitsManager)scene.UDPServer;

            IPAddress ipAddr;
            if (!IPAddress.TryParse(clientInfo.ClientIP, out ipAddr))
            {
                m_Log.InfoFormat("Invalid IP address for agent {0}", account.Principal.FullName);
                throw new LoginFailedException("Invalid IP address");
            }
            var ep      = new IPEndPoint(ipAddr, 0);
            var circuit = new AgentCircuit(
                Commands,
                agent,
                udpServer,
                circuitInfo.CircuitCode,
                m_CapsRedirector,
                circuitInfo.CapsPath,
                agent.ServiceURLs,
                m_GatekeeperURI,
                m_PacketHandlerPlugins,
                ep)
            {
                LastTeleportFlags = destinationInfo.TeleportFlags,
                Agent             = agent,
                AgentID           = account.Principal.ID,
                SessionID         = sessionInfo.SessionID
            };
            agent.Circuits.Add(circuit.Scene.ID, circuit);

            try
            {
                scene.Add(agent);
                try
                {
                    udpServer.AddCircuit(circuit);
                }
                catch
                {
                    scene.Remove(agent);
                    throw;
                }
            }
            catch (Exception e)
            {
                m_Log.Debug("Failed agent post", e);
                agent.Circuits.Clear();
                throw new LoginFailedException(e.Message);
            }

            try
            {
                agent.EconomyService?.Login(destinationInfo.ID, account.Principal, sessionInfo.SessionID, sessionInfo.SecureSessionID);
            }
            catch (Exception e)
            {
                m_Log.Warn("Could not contact EconomyService", e);
            }

            if (!circuitInfo.IsChild)
            {
                /* make agent a root agent */
                agent.SceneID = scene.ID;
                try
                {
                    m_LocalUserAccountService.SetPosition(account.Principal.ID, new UserRegionData
                    {
                        RegionID      = scene.ID,
                        Position      = agent.GlobalPosition,
                        LookAt        = agent.LookAt,
                        GatekeeperURI = new URI(scene.GatekeeperURI)
                    });
                }
                catch (Exception e)
                {
                    m_Log.Warn("Could not contact UserAccountService", e);
                }
            }

            try
            {
                m_LocalUserSessionService[agent.SessionID, KnownUserSessionInfoVariables.LocationRegionID] = scene.ID.ToString();
            }
            catch (Exception e)
            {
                m_Log.Warn("Could not contact PresenceService", e);
            }
            circuit.LogIncomingAgent(m_Log, circuitInfo.IsChild);
            capsPath = m_CapsRedirector.NewCapsURL(circuitInfo.CapsPath);
        }