diff options
author | Teravus Ovares | 2008-01-21 23:04:42 +0000 |
---|---|---|
committer | Teravus Ovares | 2008-01-21 23:04:42 +0000 |
commit | 3fe6b2280d0b335ef8d9f2b0dc3406a47e6c0b53 (patch) | |
tree | bb8cbf0b5918448c92f6b0f42fec5013450d7e25 /OpenSim/Region/Environment | |
parent | Another attempt to squash the animation bug. Wish I could get this to fail at... (diff) | |
download | opensim-SC-3fe6b2280d0b335ef8d9f2b0dc3406a47e6c0b53.zip opensim-SC-3fe6b2280d0b335ef8d9f2b0dc3406a47e6c0b53.tar.gz opensim-SC-3fe6b2280d0b335ef8d9f2b0dc3406a47e6c0b53.tar.bz2 opensim-SC-3fe6b2280d0b335ef8d9f2b0dc3406a47e6c0b53.tar.xz |
* Shutting down child agents properly in neighbor regions.
Diffstat (limited to 'OpenSim/Region/Environment')
-rw-r--r-- | OpenSim/Region/Environment/Scenes/Scene.cs | 6 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs | 64 |
2 files changed, 57 insertions, 13 deletions
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 2f961c1..7175d83 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs | |||
@@ -1288,6 +1288,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
1288 | CommsManager.LogOffUser(agentID, RegionInfo.RegionID, RegionInfo.RegionHandle, | 1288 | CommsManager.LogOffUser(agentID, RegionInfo.RegionID, RegionInfo.RegionHandle, |
1289 | avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y, | 1289 | avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y, |
1290 | avatar.AbsolutePosition.Z); | 1290 | avatar.AbsolutePosition.Z); |
1291 | m_sceneGridService.SendCloseChildAgentConnections(avatar); | ||
1291 | } | 1292 | } |
1292 | } | 1293 | } |
1293 | catch (NullReferenceException) | 1294 | catch (NullReferenceException) |
@@ -1389,6 +1390,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
1389 | m_sceneGridService.OnCloseAgentConnection += CloseConnection; | 1390 | m_sceneGridService.OnCloseAgentConnection += CloseConnection; |
1390 | m_sceneGridService.OnRegionUp += OtherRegionUp; | 1391 | m_sceneGridService.OnRegionUp += OtherRegionUp; |
1391 | m_sceneGridService.OnChildAgentUpdate += IncomingChildAgentDataUpdate; | 1392 | m_sceneGridService.OnChildAgentUpdate += IncomingChildAgentDataUpdate; |
1393 | |||
1392 | 1394 | ||
1393 | 1395 | ||
1394 | m_sceneGridService.KillObject = SendKillObject; | 1396 | m_sceneGridService.KillObject = SendKillObject; |
@@ -1509,7 +1511,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
1509 | /// </summary> | 1511 | /// </summary> |
1510 | /// <param name="regionHandle"></param> | 1512 | /// <param name="regionHandle"></param> |
1511 | /// <param name="agentID"></param> | 1513 | /// <param name="agentID"></param> |
1512 | public void CloseConnection(ulong regionHandle, LLUUID agentID) | 1514 | public bool CloseConnection(ulong regionHandle, LLUUID agentID) |
1513 | { | 1515 | { |
1514 | if (regionHandle == m_regionHandle) | 1516 | if (regionHandle == m_regionHandle) |
1515 | { | 1517 | { |
@@ -1527,8 +1529,10 @@ namespace OpenSim.Region.Environment.Scenes | |||
1527 | // Tell a single agent to disconnect from the region. | 1529 | // Tell a single agent to disconnect from the region. |
1528 | libsecondlife.Packets.DisableSimulatorPacket disable = (libsecondlife.Packets.DisableSimulatorPacket) PacketPool.Instance.GetPacket(libsecondlife.Packets.PacketType.DisableSimulator); | 1530 | libsecondlife.Packets.DisableSimulatorPacket disable = (libsecondlife.Packets.DisableSimulatorPacket) PacketPool.Instance.GetPacket(libsecondlife.Packets.PacketType.DisableSimulator); |
1529 | presence.ControllingClient.OutPacket(disable, ThrottleOutPacketType.Task); | 1531 | presence.ControllingClient.OutPacket(disable, ThrottleOutPacketType.Task); |
1532 | presence.ControllingClient.Close(true); | ||
1530 | } | 1533 | } |
1531 | } | 1534 | } |
1535 | return true; | ||
1532 | } | 1536 | } |
1533 | 1537 | ||
1534 | /// <summary> | 1538 | /// <summary> |
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 | { |