/// <summary> /// Add a root agent. /// </summary> /// <remarks> /// This function /// /// 1) Tells the scene that an agent is coming. Normally, the login service (local if standalone, from the /// userserver if grid) would give initial login data back to the client and separately tell the scene that the /// agent was coming. /// /// 2) Connects the agent with the scene /// /// This function performs actions equivalent with notifying the scene that an agent is /// coming and then actually connecting the agent to the scene. The one step missed out is the very first /// </remarks> /// <param name="scene"></param> /// <param name="agentData"></param> /// <returns></returns> public static TestClient AddRootAgent(Scene scene, AgentCircuitData agentData) { string reason; // We emulate the proper login sequence here by doing things in four stages // Stage 0: log the presence scene.PresenceService.LoginAgent(agentData.AgentID.ToString(), agentData.SessionID, agentData.SecureSessionID); // Stage 1: simulate login by telling the scene to expect a new user connection if (!scene.NewUserConnection(agentData, (uint)TeleportFlags.ViaLogin, out reason)) { Console.WriteLine("NewUserConnection failed: " + reason); } // Stage 2: add the new client as a child agent to the scene TestClient client = new TestClient(agentData, scene); scene.AddNewClient(client); // Stage 3: Complete the entrance into the region. This converts the child agent into a root agent. ScenePresence scp = scene.GetScenePresence(agentData.AgentID); scp.CompleteMovement(client); //scp.MakeRootAgent(new Vector3(90, 90, 90), true); return(client); }
public void TestDupeCompleteMovementCalls() { TestHelpers.InMethod(); // TestHelpers.EnableLogging(); UUID spUuid = TestHelpers.ParseTail(0x1); TestScene scene = new SceneHelpers().SetupScene(); int makeRootAgentEvents = 0; scene.EventManager.OnMakeRootAgent += spi => makeRootAgentEvents++; ScenePresence sp = SceneHelpers.AddScenePresence(scene, spUuid); Assert.That(makeRootAgentEvents, Is.EqualTo(1)); // Normally these would be invoked by a CompleteMovement message coming in to the UDP stack. But for // convenience, here we will invoke it manually. sp.CompleteMovement(sp.ControllingClient, true); Assert.That(makeRootAgentEvents, Is.EqualTo(1)); // Check rest of exepcted parameters. Assert.That(scene.AuthenticateHandler.GetAgentCircuitData(spUuid), Is.Not.Null); Assert.That(scene.AuthenticateHandler.GetAgentCircuits().Count, Is.EqualTo(1)); Assert.That(sp.IsChildAgent, Is.False); Assert.That(sp.UUID, Is.EqualTo(spUuid)); Assert.That(scene.GetScenePresences().Count, Is.EqualTo(1)); }
/// <summary> /// Add a root agent. /// </summary> /// <remarks> /// This function /// /// 1) Tells the scene that an agent is coming. Normally, the login service (local if standalone, from the /// userserver if grid) would give initial login data back to the client and separately tell the scene that the /// agent was coming. /// /// 2) Connects the agent with the scene /// /// This function performs actions equivalent with notifying the scene that an agent is /// coming and then actually connecting the agent to the scene. The one step missed out is the very first /// </remarks> /// <param name="scene"></param> /// <param name="agentData"></param> /// <returns></returns> public static ScenePresence AddScenePresence(Scene scene, AgentCircuitData agentData) { // We emulate the proper login sequence here by doing things in four stages // Stage 0: login scene.PresenceService.LoginAgent(agentData.AgentID.ToString(), agentData.SessionID, agentData.SecureSessionID); // Stages 1 & 2 ScenePresence sp = IntroduceClientToScene(scene, agentData, TeleportFlags.ViaLogin); // Stage 3: Complete the entrance into the region. This converts the child agent into a root agent. sp.CompleteMovement(sp.ControllingClient, true); return(sp); }
/// <summary> /// Add a root agent. /// </summary> /// <remarks> /// This function /// /// 1) Tells the scene that an agent is coming. Normally, the login service (local if standalone, from the /// userserver if grid) would give initial login data back to the client and separately tell the scene that the /// agent was coming. /// /// 2) Connects the agent with the scene /// /// This function performs actions equivalent with notifying the scene that an agent is /// coming and then actually connecting the agent to the scene. The one step missed out is the very first /// </remarks> /// <param name="scene"></param> /// <param name="agentData"></param> /// <param name="sceneManager"></param> /// <returns></returns> public static ScenePresence AddScenePresence(Scene scene, AgentCircuitData agentData, SceneManager sceneManager) { // We emulate the proper login sequence here by doing things in four stages // Stage 0: login // We need to punch through to the underlying service because scene will not, correctly, let us call it // through it's reference to the LPSC LocalPresenceServicesConnector lpsc = (LocalPresenceServicesConnector)scene.PresenceService; lpsc.m_PresenceService.LoginAgent(agentData.AgentID.ToString(), agentData.SessionID, agentData.SecureSessionID); // Stages 1 & 2 ScenePresence sp = IntroduceClientToScene(scene, sceneManager, agentData, TeleportFlags.ViaLogin); // Stage 3: Complete the entrance into the region. This converts the child agent into a root agent. sp.CompleteMovement(sp.ControllingClient, true); return sp; }