aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Environment/Scenes/ScenePresence.cs
diff options
context:
space:
mode:
authordiva2008-12-15 16:23:34 +0000
committerdiva2008-12-15 16:23:34 +0000
commit4b71b88114c6ac149571512c57ea005d85147f54 (patch)
tree18b638632d5a85b1670c9e1832398fa2d0dfb6e7 /OpenSim/Region/Environment/Scenes/ScenePresence.cs
parentUpdate svn properties. (diff)
downloadopensim-SC_OLD-4b71b88114c6ac149571512c57ea005d85147f54.zip
opensim-SC_OLD-4b71b88114c6ac149571512c57ea005d85147f54.tar.gz
opensim-SC_OLD-4b71b88114c6ac149571512c57ea005d85147f54.tar.bz2
opensim-SC_OLD-4b71b88114c6ac149571512c57ea005d85147f54.tar.xz
Bug fix in new child agents management. Thanks DigiDaz for helping identify this issue.
We need to update all child agents whenever the root agent crosses regions. The update now includes child agents in common neighbours. This is so that those get updated with the seeds of the new child agents that are spawned from the receiving region. This also fixes some timing issues. We need to close child agents from the originating region before we update child agents in the receiving region.
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Environment/Scenes/ScenePresence.cs60
1 files changed, 43 insertions, 17 deletions
diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
index f139ba5..4668dae 100644
--- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
@@ -505,6 +505,28 @@ namespace OpenSim.Region.Environment.Scenes
505 } 505 }
506 } 506 }
507 507
508 public void AdjustKnownSeeds()
509 {
510 Dictionary<ulong, string> seeds = Scene.GetChildrenSeeds(UUID);
511 List<ulong> old = new List<ulong>();
512 foreach (ulong handle in seeds.Keys)
513 {
514 uint x, y;
515 Utils.LongToUInts(handle, out x, out y);
516 x = x / Constants.RegionSize;
517 y = y / Constants.RegionSize;
518 if (Util.IsOutsideView(x, Scene.RegionInfo.RegionLocX, y, Scene.RegionInfo.RegionLocY))
519 {
520 old.Add(handle);
521 }
522 }
523 DropOldNeighbours(old);
524 Scene.SetChildrenSeed(UUID, seeds);
525 KnownRegions = seeds;
526 //Console.WriteLine(" ++++++++++AFTER+++++++++++++ ");
527 //DumpKnownRegions();
528 }
529
508 public void DumpKnownRegions() 530 public void DumpKnownRegions()
509 { 531 {
510 Console.WriteLine("================ KnownRegions {0} ================", Scene.RegionInfo.RegionName); 532 Console.WriteLine("================ KnownRegions {0} ================", Scene.RegionInfo.RegionName);
@@ -545,6 +567,7 @@ namespace OpenSim.Region.Environment.Scenes
545 m_grouptitle = gm.GetGroupTitle(m_uuid); 567 m_grouptitle = gm.GetGroupTitle(m_uuid);
546 568
547 AbsolutePosition = m_controllingClient.StartPos; 569 AbsolutePosition = m_controllingClient.StartPos;
570 AdjustKnownSeeds();
548 571
549 TrySetMovementAnimation("STAND"); // TODO: I think, this won't send anything, as we are still a child here... 572 TrySetMovementAnimation("STAND"); // TODO: I think, this won't send anything, as we are still a child here...
550 573
@@ -935,7 +958,7 @@ namespace OpenSim.Region.Environment.Scenes
935 if (m_knownChildRegions.ContainsKey(regionHandle)) 958 if (m_knownChildRegions.ContainsKey(regionHandle))
936 { 959 {
937 m_knownChildRegions.Remove(regionHandle); 960 m_knownChildRegions.Remove(regionHandle);
938 //Console.WriteLine(" !!! removing known region {0} in {1}. Count = {2}", regionHandle, Scene.RegionInfo.RegionName, m_knownChildRegions.Count); 961 //Console.WriteLine(" !!! removing known region {0} in {1}. Count = {2}", regionHandle, Scene.RegionInfo.RegionName, m_knownChildRegions.Count);
939 } 962 }
940 } 963 }
941 } 964 }
@@ -1949,9 +1972,6 @@ namespace OpenSim.Region.Environment.Scenes
1949 CheckForBorderCrossing(); 1972 CheckForBorderCrossing();
1950 CheckForSignificantMovement(); // sends update to the modules. 1973 CheckForSignificantMovement(); // sends update to the modules.
1951 } 1974 }
1952
1953 //if ((x++ % 30) == 0)
1954 // Console.WriteLine(" >> In {0} known regions: {0}, seeds:{1}", Scene.RegionInfo.RegionName, KnownRegions.Count, Scene.GetChildrenSeeds(UUID));
1955 } 1975 }
1956 1976
1957 #endregion 1977 #endregion
@@ -2412,6 +2432,9 @@ namespace OpenSim.Region.Environment.Scenes
2412 m_physicsActor.Flying); 2432 m_physicsActor.Flying);
2413 if (crossingSuccessful) 2433 if (crossingSuccessful)
2414 { 2434 {
2435 // Next, let's close the child agent connections that are too far away.
2436 CloseChildAgents(neighbourx, neighboury);
2437
2415 AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo(); 2438 AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo();
2416 2439
2417 //Console.WriteLine("BEFORE CROSS"); 2440 //Console.WriteLine("BEFORE CROSS");
@@ -2446,15 +2469,15 @@ namespace OpenSim.Region.Environment.Scenes
2446 CrossAttachmentsIntoNewRegion(neighbourHandle, true); 2469 CrossAttachmentsIntoNewRegion(neighbourHandle, true);
2447 2470
2448 // m_scene.SendKillObject(m_localId); 2471 // m_scene.SendKillObject(m_localId);
2449 // Next, let's close the child agent connections that are too far away.
2450 CloseChildAgents(neighbourx, neighboury);
2451 2472
2452 m_scene.NotifyMyCoarseLocationChange(); 2473 m_scene.NotifyMyCoarseLocationChange();
2453 // the user may change their profile information in other region, 2474 // the user may change their profile information in other region,
2454 // so the userinfo in UserProfileCache is not reliable any more, delete it 2475 // so the userinfo in UserProfileCache is not reliable any more, delete it
2455 if (m_scene.NeedSceneCacheClear(UUID)) 2476 if (m_scene.NeedSceneCacheClear(UUID))
2477 {
2456 m_scene.CommsManager.UserProfileCacheService.RemoveUser(UUID); 2478 m_scene.CommsManager.UserProfileCacheService.RemoveUser(UUID);
2457 m_log.InfoFormat("[AVATAR]: User {0} is going to another region, profile cache removed", UUID); 2479 m_log.InfoFormat("[AVATAR]: User {0} is going to another region, profile cache removed", UUID);
2480 }
2458 } 2481 }
2459 else 2482 else
2460 { 2483 {
@@ -2487,16 +2510,20 @@ namespace OpenSim.Region.Environment.Scenes
2487 { 2510 {
2488 foreach (ulong handle in m_knownChildRegions.Keys) 2511 foreach (ulong handle in m_knownChildRegions.Keys)
2489 { 2512 {
2490 uint x, y; 2513 // Don't close the agent on this region yet
2491 Utils.LongToUInts(handle, out x, out y); 2514 if (handle != Scene.RegionInfo.RegionHandle)
2492 x = x / Constants.RegionSize;
2493 y = y / Constants.RegionSize;
2494
2495 //Console.WriteLine("---> x: " + x + "; newx:" + newRegionX + "; Abs:" + (int)Math.Abs((int)(x - newRegionX)));
2496 //Console.WriteLine("---> y: " + y + "; newy:" + newRegionY + "; Abs:" + (int)Math.Abs((int)(y - newRegionY)));
2497 if (Util.IsOutsideView(x, newRegionX, y, newRegionY))
2498 { 2515 {
2499 byebyeRegions.Add(handle); 2516 uint x, y;
2517 Utils.LongToUInts(handle, out x, out y);
2518 x = x / Constants.RegionSize;
2519 y = y / Constants.RegionSize;
2520
2521 //Console.WriteLine("---> x: " + x + "; newx:" + newRegionX + "; Abs:" + (int)Math.Abs((int)(x - newRegionX)));
2522 //Console.WriteLine("---> y: " + y + "; newy:" + newRegionY + "; Abs:" + (int)Math.Abs((int)(y - newRegionY)));
2523 if (Util.IsOutsideView(x, newRegionX, y, newRegionY))
2524 {
2525 byebyeRegions.Add(handle);
2526 }
2500 } 2527 }
2501 } 2528 }
2502 } 2529 }
@@ -2510,7 +2537,6 @@ namespace OpenSim.Region.Environment.Scenes
2510 RemoveNeighbourRegion(handle); 2537 RemoveNeighbourRegion(handle);
2511 } 2538 }
2512 2539
2513
2514 } 2540 }
2515 2541
2516 #endregion 2542 #endregion