aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Region/Environment/Scenes/Scene.cs33
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs11
-rw-r--r--OpenSim/Region/Environment/Scenes/ScenePresence.cs15
3 files changed, 48 insertions, 11 deletions
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
index 951e467..f02f038 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -1498,11 +1498,7 @@ namespace OpenSim.Region.Environment.Scenes
1498 } 1498 }
1499 m_sceneGridService.SendCloseChildAgentConnections(agentID, childknownRegions); 1499 m_sceneGridService.SendCloseChildAgentConnections(agentID, childknownRegions);
1500 1500
1501 if (m_capsHandlers.ContainsKey(agentID)) 1501 RemoveCapsHandler(agentID);
1502 {
1503 m_capsHandlers[agentID].DeregisterHandlers();
1504 m_capsHandlers.Remove(agentID);
1505 }
1506 } 1502 }
1507 1503
1508 m_eventManager.TriggerClientClosed(agentID); 1504 m_eventManager.TriggerClientClosed(agentID);
@@ -1717,8 +1713,8 @@ namespace OpenSim.Region.Environment.Scenes
1717 String capsObjectPath = GetCapsPath(agentId); 1713 String capsObjectPath = GetCapsPath(agentId);
1718 1714
1719 m_log.DebugFormat( 1715 m_log.DebugFormat(
1720 "[CONNECTION DEBUGGING]: Setting up CAPS handler for avatar {0} at {1} in {2}", 1716 "[CONNECTION DEBUGGING]: Setting up CAPS handler for avatar {0} in {1}",
1721 agentId, capsObjectPath, RegionInfo.RegionName); 1717 agentId, RegionInfo.RegionName);
1722 1718
1723 Caps cap = 1719 Caps cap =
1724 new Caps(AssetCache, m_httpListener, m_regInfo.ExternalHostName, m_httpListener.Port, 1720 new Caps(AssetCache, m_httpListener, m_regInfo.ExternalHostName, m_httpListener.Port,
@@ -1735,6 +1731,29 @@ namespace OpenSim.Region.Environment.Scenes
1735 } 1731 }
1736 1732
1737 /// <summary> 1733 /// <summary>
1734 /// Remove the caps handler for a given agent.
1735 /// </summary>
1736 /// <param name="agentId"></param>
1737 public void RemoveCapsHandler(LLUUID agentId)
1738 {
1739 if (m_capsHandlers.ContainsKey(agentId))
1740 {
1741 m_log.DebugFormat(
1742 "[CONNECTION DEBUGGING]: Removing CAPS handler for root agent {0} in {1}",
1743 agentId, RegionInfo.RegionName);
1744
1745 m_capsHandlers[agentId].DeregisterHandlers();
1746 m_capsHandlers.Remove(agentId);
1747 }
1748 else
1749 {
1750 m_log.WarnFormat(
1751 "[CONNECTION DEBUGGING]: Received request to remove CAPS handler for root agent {0} in {1}, but no such CAPS handler found!",
1752 agentId, RegionInfo.RegionName);
1753 }
1754 }
1755
1756 /// <summary>
1738 /// 1757 ///
1739 /// </summary> 1758 /// </summary>
1740 /// <param name="regionHandle"></param> 1759 /// <param name="regionHandle"></param>
diff --git a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs
index f2b2f20..318b04a 100644
--- a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs
@@ -547,6 +547,12 @@ namespace OpenSim.Region.Environment.Scenes
547 if(destRegionUp) 547 if(destRegionUp)
548 { 548 {
549 avatar.Close(); 549 avatar.Close();
550
551 // Compared to ScenePresence.CrossToNewRegion(), there's no obvious code to handle a teleport
552 // failure at this point (unlike a border crossing failure). So perhaps this can never fail
553 // once we reach here...
554 avatar.Scene.RemoveCapsHandler(avatar.UUID);
555
550 m_commsProvider.InterRegion.InformRegionOfChildAgent(regionHandle, agent); 556 m_commsProvider.InterRegion.InformRegionOfChildAgent(regionHandle, agent);
551 m_commsProvider.InterRegion.ExpectAvatarCrossing(regionHandle, avatar.ControllingClient.AgentId, 557 m_commsProvider.InterRegion.ExpectAvatarCrossing(regionHandle, avatar.ControllingClient.AgentId,
552 position, false); 558 position, false);
@@ -555,7 +561,10 @@ namespace OpenSim.Region.Environment.Scenes
555 // TODO Should construct this behind a method 561 // TODO Should construct this behind a method
556 string capsPath = 562 string capsPath =
557 "http://" + reg.ExternalHostName + ":" + reg.HttpPort 563 "http://" + reg.ExternalHostName + ":" + reg.HttpPort
558 + "/CAPS/" + circuitdata.CapsPath + "0000/"; 564 + "/CAPS/" + circuitdata.CapsPath + "0000/";
565
566 m_log.DebugFormat(
567 "[CONNECTION DEBUGGING]: Sending new CAPS seed url {0} to avatar {1}", capsPath, avatar.UUID);
559 568
560 avatar.ControllingClient.SendRegionTeleport(regionHandle, 13, reg.ExternalEndPoint, 4, (1 << 4), 569 avatar.ControllingClient.SendRegionTeleport(regionHandle, 13, reg.ExternalEndPoint, 4, (1 << 4),
561 capsPath); 570 capsPath);
diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
index df43490..8f9cbbf 100644
--- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
@@ -1618,12 +1618,17 @@ namespace OpenSim.Region.Environment.Scenes
1618 ulong neighbourHandle = Helpers.UIntsToLong((uint)(neighbourx * Constants.RegionSize), (uint)(neighboury * Constants.RegionSize)); 1618 ulong neighbourHandle = Helpers.UIntsToLong((uint)(neighbourx * Constants.RegionSize), (uint)(neighboury * Constants.RegionSize));
1619 SimpleRegionInfo neighbourRegion = m_scene.RequestNeighbouringRegionInfo(neighbourHandle); 1619 SimpleRegionInfo neighbourRegion = m_scene.RequestNeighbouringRegionInfo(neighbourHandle);
1620 if (neighbourRegion != null) 1620 if (neighbourRegion != null)
1621 { 1621 {
1622 // When the neighbour is informed of the border crossing, it will set up CAPS handlers for the avatar
1623 // This means we need to remove the current caps handler here and possibly compensate later,
1624 // in case both scenes are being hosted on the same region server. Messy
1625 m_scene.RemoveCapsHandler(UUID);
1626
1622 bool res = 1627 bool res =
1623 m_scene.InformNeighbourOfCrossing(neighbourHandle, m_controllingClient.AgentId, newpos, 1628 m_scene.InformNeighbourOfCrossing(neighbourHandle, m_controllingClient.AgentId, newpos,
1624 m_physicsActor.Flying); 1629 m_physicsActor.Flying);
1625 if (res) 1630 if (res)
1626 { 1631 {
1627 AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo(); 1632 AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo();
1628 1633
1629 // TODO Should construct this behind a method 1634 // TODO Should construct this behind a method
@@ -1632,7 +1637,7 @@ namespace OpenSim.Region.Environment.Scenes
1632 + "/CAPS/" + circuitdata.CapsPath + "0000/"; 1637 + "/CAPS/" + circuitdata.CapsPath + "0000/";
1633 1638
1634 m_log.DebugFormat( 1639 m_log.DebugFormat(
1635 "[CONNECTION DEBUGGING]: Sending new CAPS seed url {0} to avatar {1}", capsPath, m_uuid); 1640 "[CONNECTION DEBUGGING]: Sending new CAPS seed url {0} to avatar {1}", capsPath, m_uuid);
1636 1641
1637 m_controllingClient.CrossRegion(neighbourHandle, newpos, vel, neighbourRegion.ExternalEndPoint, 1642 m_controllingClient.CrossRegion(neighbourHandle, newpos, vel, neighbourRegion.ExternalEndPoint,
1638 capsPath); 1643 capsPath);
@@ -1640,6 +1645,10 @@ namespace OpenSim.Region.Environment.Scenes
1640 m_scene.SendKillObject(m_localId); 1645 m_scene.SendKillObject(m_localId);
1641 m_scene.NotifyMyCoarseLocationChange(); 1646 m_scene.NotifyMyCoarseLocationChange();
1642 } 1647 }
1648 else
1649 {
1650 m_scene.AddCapsHandler(UUID);
1651 }
1643 } 1652 }
1644 } 1653 }
1645 1654