diff options
author | diva | 2008-12-15 16:23:34 +0000 |
---|---|---|
committer | diva | 2008-12-15 16:23:34 +0000 |
commit | 4b71b88114c6ac149571512c57ea005d85147f54 (patch) | |
tree | 18b638632d5a85b1670c9e1832398fa2d0dfb6e7 /OpenSim/Region/Environment/Scenes/ScenePresence.cs | |
parent | Update svn properties. (diff) | |
download | opensim-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 'OpenSim/Region/Environment/Scenes/ScenePresence.cs')
-rw-r--r-- | OpenSim/Region/Environment/Scenes/ScenePresence.cs | 60 |
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 |