aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules/Framework
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/CoreModules/Framework')
-rw-r--r--OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs74
1 files changed, 57 insertions, 17 deletions
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index 3fcc0e8..927eeab 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -396,7 +396,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
396 agent.Position = position; 396 agent.Position = position;
397 SetCallbackURL(agent, sp.Scene.RegionInfo); 397 SetCallbackURL(agent, sp.Scene.RegionInfo);
398 398
399 UpdateAgent(reg, finalDestination, agent); 399 if (!UpdateAgent(reg, finalDestination, agent))
400 {
401 // Region doesn't take it
402 Fail(sp, finalDestination);
403 return;
404 }
400 405
401 m_log.DebugFormat( 406 m_log.DebugFormat(
402 "[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, sp.UUID); 407 "[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, sp.UUID);
@@ -421,21 +426,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
421 // that the client contacted the destination before we send the attachments and close things here. 426 // that the client contacted the destination before we send the attachments and close things here.
422 if (!WaitForCallback(sp.UUID)) 427 if (!WaitForCallback(sp.UUID))
423 { 428 {
424 // Client never contacted destination. Let's restore everything back 429 Fail(sp, finalDestination);
425 sp.ControllingClient.SendTeleportFailed("Problems connecting to destination.");
426
427 // Fail. Reset it back
428 sp.IsChildAgent = false;
429
430 ResetFromTransit(sp.UUID);
431
432 // Yikes! We should just have a ref to scene here.
433 //sp.Scene.InformClientOfNeighbours(sp);
434 EnableChildAgents(sp);
435
436 // Finally, kill the agent we just created at the destination.
437 m_aScene.SimulationService.CloseAgent(finalDestination, sp.UUID);
438
439 return; 430 return;
440 } 431 }
441 432
@@ -475,6 +466,22 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
475 } 466 }
476 } 467 }
477 468
469 private void Fail(ScenePresence sp, GridRegion finalDestination)
470 {
471 // Client never contacted destination. Let's restore everything back
472 sp.ControllingClient.SendTeleportFailed("Problems connecting to destination.");
473
474 // Fail. Reset it back
475 sp.IsChildAgent = false;
476
477 ResetFromTransit(sp.UUID);
478
479 EnableChildAgents(sp);
480
481 // Finally, kill the agent we just created at the destination.
482 m_aScene.SimulationService.CloseAgent(finalDestination, sp.UUID);
483
484 }
478 485
479 protected virtual bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason) 486 protected virtual bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason)
480 { 487 {
@@ -813,7 +820,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
813 cAgent.CallbackURI = "http://" + m_scene.RegionInfo.ExternalHostName + ":" + m_scene.RegionInfo.HttpPort + 820 cAgent.CallbackURI = "http://" + m_scene.RegionInfo.ExternalHostName + ":" + m_scene.RegionInfo.HttpPort +
814 "/agent/" + agent.UUID.ToString() + "/" + m_scene.RegionInfo.RegionID.ToString() + "/release/"; 821 "/agent/" + agent.UUID.ToString() + "/" + m_scene.RegionInfo.RegionID.ToString() + "/release/";
815 822
816 m_scene.SimulationService.UpdateAgent(neighbourRegion, cAgent); 823 if (!m_scene.SimulationService.UpdateAgent(neighbourRegion, cAgent))
824 {
825 // region doesn't take it
826 ResetFromTransit(agent.UUID);
827 return agent;
828 }
817 829
818 // Next, let's close the child agent connections that are too far away. 830 // Next, let's close the child agent connections that are too far away.
819 agent.CloseChildAgents(neighbourx, neighboury); 831 agent.CloseChildAgents(neighbourx, neighboury);
@@ -914,12 +926,40 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
914 /// </summary> 926 /// </summary>
915 public void EnableChildAgent(ScenePresence sp, GridRegion region) 927 public void EnableChildAgent(ScenePresence sp, GridRegion region)
916 { 928 {
929 m_log.DebugFormat("[ENTITY TRANSFER]: Enabling child agent in new neighour {0}", region.RegionName);
930
931 AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode);
917 AgentCircuitData agent = sp.ControllingClient.RequestClientInfo(); 932 AgentCircuitData agent = sp.ControllingClient.RequestClientInfo();
918 agent.BaseFolder = UUID.Zero; 933 agent.BaseFolder = UUID.Zero;
919 agent.InventoryFolder = UUID.Zero; 934 agent.InventoryFolder = UUID.Zero;
920 agent.startpos = new Vector3(128, 128, 70); 935 agent.startpos = new Vector3(128, 128, 70);
921 agent.child = true; 936 agent.child = true;
922 agent.Appearance = sp.Appearance; 937 agent.Appearance = sp.Appearance;
938 agent.CapsPath = CapsUtil.GetRandomCapsObjectPath();
939
940 agent.ChildrenCapSeeds = new Dictionary<ulong, string>(sp.Scene.CapsModule.GetChildrenSeeds(sp.UUID));
941 m_log.DebugFormat("[XXX] Seeds 1 {0}", agent.ChildrenCapSeeds.Count);
942
943 if (!agent.ChildrenCapSeeds.ContainsKey(sp.Scene.RegionInfo.RegionHandle))
944 agent.ChildrenCapSeeds.Add(sp.Scene.RegionInfo.RegionHandle, sp.ControllingClient.RequestClientInfo().CapsPath);
945 m_log.DebugFormat("[XXX] Seeds 2 {0}", agent.ChildrenCapSeeds.Count);
946
947 sp.AddNeighbourRegion(region.RegionHandle, agent.CapsPath);
948 foreach (ulong h in agent.ChildrenCapSeeds.Keys)
949 m_log.DebugFormat("[XXX] --> {0}", h);
950 m_log.DebugFormat("[XXX] Adding {0}", region.RegionHandle);
951 agent.ChildrenCapSeeds.Add(region.RegionHandle, agent.CapsPath);
952
953 if (sp.Scene.CapsModule != null)
954 {
955 sp.Scene.CapsModule.SetChildrenSeed(sp.UUID, agent.ChildrenCapSeeds);
956 }
957
958 if (currentAgentCircuit != null)
959 {
960 agent.ServiceURLs = currentAgentCircuit.ServiceURLs;
961 agent.Viewer = currentAgentCircuit.Viewer;
962 }
923 963
924 IPEndPoint external = region.ExternalEndPoint; 964 IPEndPoint external = region.ExternalEndPoint;
925 if (external != null) 965 if (external != null)