diff options
Diffstat (limited to 'OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs')
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs | 64 |
1 files changed, 52 insertions, 12 deletions
diff --git a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs index 666edb1..a9c2c2f 100644 --- a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs | |||
@@ -51,6 +51,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
51 | public event PrimCrossing OnPrimCrossingIntoRegion; | 51 | public event PrimCrossing OnPrimCrossingIntoRegion; |
52 | public event RegionUp OnRegionUp; | 52 | public event RegionUp OnRegionUp; |
53 | public event ChildAgentUpdate OnChildAgentUpdate; | 53 | public event ChildAgentUpdate OnChildAgentUpdate; |
54 | |||
54 | 55 | ||
55 | 56 | ||
56 | public KillObjectDelegate KillObject; | 57 | public KillObjectDelegate KillObject; |
@@ -86,6 +87,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
86 | regionCommsHost.OnCloseAgentConnection += CloseConnection; | 87 | regionCommsHost.OnCloseAgentConnection += CloseConnection; |
87 | regionCommsHost.OnRegionUp += newRegionUp; | 88 | regionCommsHost.OnRegionUp += newRegionUp; |
88 | regionCommsHost.OnChildAgentUpdate += ChildAgentUpdate; | 89 | regionCommsHost.OnChildAgentUpdate += ChildAgentUpdate; |
90 | |||
89 | } | 91 | } |
90 | else | 92 | else |
91 | { | 93 | { |
@@ -160,12 +162,15 @@ namespace OpenSim.Region.Environment.Scenes | |||
160 | } | 162 | } |
161 | } | 163 | } |
162 | 164 | ||
163 | protected void CloseConnection(ulong regionHandle, LLUUID agentID) | 165 | protected bool CloseConnection(ulong regionHandle, LLUUID agentID) |
164 | { | 166 | { |
167 | MainLog.Instance.Verbose("INTERREGION", "Incoming Agent Close Request for agent: " + agentID.ToString()); | ||
168 | |||
165 | if (OnCloseAgentConnection != null) | 169 | if (OnCloseAgentConnection != null) |
166 | { | 170 | { |
167 | OnCloseAgentConnection(regionHandle, agentID); | 171 | return OnCloseAgentConnection(regionHandle, agentID); |
168 | } | 172 | } |
173 | return false; | ||
169 | } | 174 | } |
170 | 175 | ||
171 | #endregion | 176 | #endregion |
@@ -366,6 +371,50 @@ namespace OpenSim.Region.Environment.Scenes | |||
366 | d); | 371 | d); |
367 | } | 372 | } |
368 | 373 | ||
374 | public delegate void SendCloseChildAgentDelegate( ScenePresence presence); | ||
375 | |||
376 | /// <summary> | ||
377 | /// This informs all neighboring regions about the settings of it's child agent. | ||
378 | /// Calls an asynchronous method to do so.. so it doesn't lag the sim. | ||
379 | /// | ||
380 | /// This contains information, such as, Draw Distance, Camera location, Current Position, Current throttle settings, etc. | ||
381 | /// | ||
382 | /// </summary> | ||
383 | private void SendCloseChildAgentAsync(ScenePresence presence) | ||
384 | { | ||
385 | |||
386 | foreach (ulong regionHandle in presence.KnownChildRegions) | ||
387 | { | ||
388 | bool regionAccepted = m_commsProvider.InterRegion.TellRegionToCloseChildConnection(regionHandle, presence.ControllingClient.AgentId); | ||
389 | |||
390 | if (regionAccepted) | ||
391 | { | ||
392 | MainLog.Instance.Notice("INTERGRID", "Completed sending agent Close agent Request to neighbor"); | ||
393 | presence.RemoveNeighbourRegion(regionHandle); | ||
394 | } | ||
395 | else | ||
396 | { | ||
397 | MainLog.Instance.Notice("INTERGRID", "Failed sending agent Close agent Request to neighbor"); | ||
398 | |||
399 | } | ||
400 | |||
401 | } | ||
402 | } | ||
403 | |||
404 | private void SendCloseChildAgentCompleted(IAsyncResult iar) | ||
405 | { | ||
406 | SendCloseChildAgentDelegate icon = (SendCloseChildAgentDelegate)iar.AsyncState; | ||
407 | icon.EndInvoke(iar); | ||
408 | } | ||
409 | |||
410 | public void SendCloseChildAgentConnections(ScenePresence presence) | ||
411 | { | ||
412 | // This assumes that we know what our neighbors are. | ||
413 | SendCloseChildAgentDelegate d = SendCloseChildAgentAsync; | ||
414 | d.BeginInvoke(presence, | ||
415 | SendCloseChildAgentCompleted, | ||
416 | d); | ||
417 | } | ||
369 | 418 | ||
370 | /// <summary> | 419 | /// <summary> |
371 | /// Helper function to request neighbors from grid-comms | 420 | /// Helper function to request neighbors from grid-comms |
@@ -454,7 +503,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
454 | uint oldRegionY = (((uint)(m_regionInfo.RegionHandle)) >> 8); | 503 | uint oldRegionY = (((uint)(m_regionInfo.RegionHandle)) >> 8); |
455 | if (Util.fast_distance2d((int)(newRegionX - oldRegionX), (int)(newRegionY - oldRegionY)) > 3) | 504 | if (Util.fast_distance2d((int)(newRegionX - oldRegionX), (int)(newRegionY - oldRegionY)) > 3) |
456 | { | 505 | { |
457 | CloseChildAgentConnections(avatar); | 506 | SendCloseChildAgentConnections(avatar); |
458 | } | 507 | } |
459 | } | 508 | } |
460 | else | 509 | else |
@@ -481,15 +530,6 @@ namespace OpenSim.Region.Environment.Scenes | |||
481 | return m_commsProvider.InterRegion.ExpectPrimCrossing(regionhandle, primID, position, isPhysical); | 530 | return m_commsProvider.InterRegion.ExpectPrimCrossing(regionhandle, primID, position, isPhysical); |
482 | } | 531 | } |
483 | 532 | ||
484 | public void CloseChildAgentConnections(ScenePresence presence) | ||
485 | { | ||
486 | foreach (ulong regionHandle in presence.KnownChildRegions) | ||
487 | { | ||
488 | m_commsProvider.InterRegion.TellRegionToCloseChildConnection(regionHandle, | ||
489 | presence.ControllingClient.AgentId); | ||
490 | presence.RemoveNeighbourRegion(regionHandle); | ||
491 | } | ||
492 | } | ||
493 | 533 | ||
494 | public Dictionary<string, string> GetGridSettings() | 534 | public Dictionary<string, string> GetGridSettings() |
495 | { | 535 | { |