diff --git a/OpenSim/Framework/RegionInfo.cs b/OpenSim/Framework/RegionInfo.cs index ff5c204ece..bd896bd392 100644 --- a/OpenSim/Framework/RegionInfo.cs +++ b/OpenSim/Framework/RegionInfo.cs @@ -64,6 +64,16 @@ namespace OpenSim.Framework m_internalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), (int) port); } + public SimpleRegionInfo(RegionInfo ConvertFrom) + { + m_regionLocX = ConvertFrom.RegionLocX; + m_regionLocY = ConvertFrom.RegionLocY; + m_internalEndPoint = ConvertFrom.InternalEndPoint; + m_externalHostName = ConvertFrom.ExternalHostName; + m_remotingPort = ConvertFrom.RemotingPort; + RemotingAddress = ConvertFrom.RemotingAddress; + RegionID = LLUUID.Zero; + } public LLUUID RegionID = LLUUID.Zero; @@ -238,6 +248,16 @@ namespace OpenSim.Framework RemotingAddress = ConvertFrom.RemotingAddress; RegionID = LLUUID.Zero; } + public RegionInfo(SimpleRegionInfo ConvertFrom) + { + m_regionLocX = ConvertFrom.RegionLocX; + m_regionLocY = ConvertFrom.RegionLocY; + m_internalEndPoint = ConvertFrom.InternalEndPoint; + m_externalHostName = ConvertFrom.ExternalHostName; + m_remotingPort = ConvertFrom.RemotingPort; + RemotingAddress = ConvertFrom.RemotingAddress; + RegionID = LLUUID.Zero; + } //not in use, should swap to nini though. public void LoadFromNiniSource(IConfigSource source) { diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 01bcd83c03..587d940972 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -269,7 +269,12 @@ namespace OpenSim.Region.Environment.Scenes { // Another region is up. // We have to tell all our ScenePresences about it.. - //and add it to the neighbor list. + // and add it to the neighbor list. + + // We only add it to the neighbor list if it's within 1 region from here. + // Agents may have draw distance values that cross two regions though, so + // we add it to the notify list regardless of distance. + // We'll check the agent's draw distance before notifying them though. if (RegionInfo.RegionHandle != otherRegion.RegionHandle) @@ -297,12 +302,11 @@ namespace OpenSim.Region.Environment.Scenes { m_neighbours.Add(otherRegion); } - if (!(m_regionRestartNotifyList.Contains(otherRegion))) { m_regionRestartNotifyList.Add(otherRegion); - - m_restartWaitTimer.Interval= 50000; + + m_restartWaitTimer.Interval = 50000; m_restartWaitTimer.AutoReset = false; m_restartWaitTimer.Elapsed += new ElapsedEventHandler(RestartNotifyWaitElapsed); m_restartWaitTimer.Start(); @@ -312,6 +316,9 @@ namespace OpenSim.Region.Environment.Scenes { MainLog.Instance.Verbose("INTERGRID", "Got notice about Region at X:" + otherRegion.RegionLocX.ToString() + " Y:" + otherRegion.RegionLocY.ToString() + " but it was too far away to send to the client"); } + + + } return true; @@ -1250,7 +1257,7 @@ namespace OpenSim.Region.Environment.Scenes /// public void InformClientOfNeighbours(ScenePresence presence) { - m_sceneGridService.EnableNeighbourChildAgents(presence); + m_sceneGridService.EnableNeighbourChildAgents(presence, m_neighbours); } /// @@ -1260,7 +1267,7 @@ namespace OpenSim.Region.Environment.Scenes /// public void InformClientOfNeighbor(ScenePresence presence, RegionInfo region) { - m_sceneGridService.InformNeighborChildAgent(presence, region); + m_sceneGridService.InformNeighborChildAgent(presence, region, m_neighbours); } /// diff --git a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs index 4d2379be93..68bb3b5be8 100644 --- a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs @@ -191,14 +191,24 @@ namespace OpenSim.Region.Environment.Scenes /// /// /// - public void EnableNeighbourChildAgents(ScenePresence avatar) + public void EnableNeighbourChildAgents(ScenePresence avatar, List lstneighbours) { - List neighbours = - m_commsProvider.GridService.RequestNeighbours(m_regionInfo.RegionLocX, m_regionInfo.RegionLocY); + List neighbours = new List(); + + //m_commsProvider.GridService.RequestNeighbours(m_regionInfo.RegionLocX, m_regionInfo.RegionLocY); + for (int i = 0; i < lstneighbours.Count; i++) + { + // We don't want to keep sending to regions that consistently fail on comms. + if (!(lstneighbours[i].commFailTF)) + { + neighbours.Add(new SimpleRegionInfo(lstneighbours[i])); + } + } if (neighbours != null) { for (int i = 0; i < neighbours.Count; i++) { + AgentCircuitData agent = avatar.ControllingClient.RequestClientInfo(); agent.BaseFolder = LLUUID.Zero; agent.InventoryFolder = LLUUID.Zero; @@ -212,7 +222,7 @@ namespace OpenSim.Region.Environment.Scenes } } } - public void InformNeighborChildAgent(ScenePresence avatar, RegionInfo region) + public void InformNeighborChildAgent(ScenePresence avatar, RegionInfo region, List neighbours) { AgentCircuitData agent = avatar.ControllingClient.RequestClientInfo(); agent.BaseFolder = LLUUID.Zero; @@ -257,7 +267,7 @@ namespace OpenSim.Region.Environment.Scenes List neighbours = new List(); - + // This stays uncached because we don't already know about our neighbors at this point. neighbours = m_commsProvider.GridService.RequestNeighbours(m_regionInfo.RegionLocX, m_regionInfo.RegionLocY); if (neighbours != null) {