aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Environment
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Environment/Scenes/Hypergrid/HGSceneCommunicationService.cs82
-rw-r--r--OpenSim/Region/Environment/Scenes/Scene.cs17
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs131
-rw-r--r--OpenSim/Region/Environment/Scenes/ScenePresence.cs60
4 files changed, 174 insertions, 116 deletions
diff --git a/OpenSim/Region/Environment/Scenes/Hypergrid/HGSceneCommunicationService.cs b/OpenSim/Region/Environment/Scenes/Hypergrid/HGSceneCommunicationService.cs
index 9e23831..595ac09 100644
--- a/OpenSim/Region/Environment/Scenes/Hypergrid/HGSceneCommunicationService.cs
+++ b/OpenSim/Region/Environment/Scenes/Hypergrid/HGSceneCommunicationService.cs
@@ -169,6 +169,17 @@ namespace OpenSim.Region.Environment.Scenes.Hypergrid
169 // once we reach here... 169 // once we reach here...
170 //avatar.Scene.RemoveCapsHandler(avatar.UUID); 170 //avatar.Scene.RemoveCapsHandler(avatar.UUID);
171 171
172 // Let's close some agents
173 if (isHyperLink) // close them all except this one
174 {
175 List<ulong> regions = new List<ulong>(avatar.KnownChildRegionHandles);
176 regions.Remove(avatar.Scene.RegionInfo.RegionHandle);
177 SendCloseChildAgentConnections(avatar.UUID, regions);
178 }
179 else // close just a few
180 avatar.CloseChildAgents(newRegionX, newRegionY);
181
182 string capsPath = String.Empty;
172 AgentCircuitData agent = avatar.ControllingClient.RequestClientInfo(); 183 AgentCircuitData agent = avatar.ControllingClient.RequestClientInfo();
173 agent.BaseFolder = UUID.Zero; 184 agent.BaseFolder = UUID.Zero;
174 agent.InventoryFolder = UUID.Zero; 185 agent.InventoryFolder = UUID.Zero;
@@ -178,38 +189,39 @@ namespace OpenSim.Region.Environment.Scenes.Hypergrid
178 { 189 {
179 // brand new agent 190 // brand new agent
180 agent.CapsPath = Util.GetRandomCapsPath(); 191 agent.CapsPath = Util.GetRandomCapsPath();
192 if (!m_commsProvider.InterRegion.InformRegionOfChildAgent(reg.RegionHandle, agent))
193 {
194 avatar.ControllingClient.SendTeleportFailed("Destination is not accepting teleports.");
195 return;
196 }
197
198 // TODO Should construct this behind a method
199 capsPath =
200 "http://" + reg.ExternalHostName + ":" + reg.HttpPort
201 + "/CAPS/" + agent.CapsPath + "0000/";
202
203 if (eq != null)
204 {
205 OSD Item = EventQueueHelper.EnableSimulator(realHandle, reg.ExternalEndPoint);
206 eq.Enqueue(Item, avatar.UUID);
207
208 Item = EventQueueHelper.EstablishAgentCommunication(avatar.UUID, reg.ExternalEndPoint.ToString(), capsPath);
209 eq.Enqueue(Item, avatar.UUID);
210 }
211 else
212 {
213 avatar.ControllingClient.InformClientOfNeighbour(realHandle, reg.ExternalEndPoint);
214 // TODO: make Event Queue disablable!
215 }
181 } 216 }
182 else 217 else
183 { 218 {
184 // child agent already there 219 // child agent already there
185 agent.CapsPath = avatar.Scene.GetChildSeed(avatar.UUID, reg.RegionHandle); 220 agent.CapsPath = avatar.Scene.GetChildSeed(avatar.UUID, reg.RegionHandle);
221 capsPath = "http://" + reg.ExternalHostName + ":" + reg.HttpPort
222 + "/CAPS/" + agent.CapsPath + "0000/";
186 } 223 }
187 224
188 if (!m_commsProvider.InterRegion.InformRegionOfChildAgent(reg.RegionHandle, agent))
189 {
190 avatar.ControllingClient.SendTeleportFailed("Destination is not accepting teleports.");
191 return;
192 }
193
194 // TODO Should construct this behind a method
195 string capsPath =
196 "http://" + reg.ExternalHostName + ":" + reg.HttpPort
197 + "/CAPS/" + agent.CapsPath + "0000/";
198
199 if (eq != null)
200 {
201 OSD Item = EventQueueHelper.EnableSimulator(realHandle, reg.ExternalEndPoint);
202 eq.Enqueue(Item, avatar.UUID);
203
204 Item = EventQueueHelper.EstablishAgentCommunication(avatar.UUID, reg.ExternalEndPoint.ToString(), capsPath);
205 eq.Enqueue(Item, avatar.UUID);
206 }
207 else
208 {
209 avatar.ControllingClient.InformClientOfNeighbour(realHandle, reg.ExternalEndPoint);
210 // TODO: make Event Queue disablable!
211 }
212
213 m_commsProvider.InterRegion.ExpectAvatarCrossing(reg.RegionHandle, avatar.ControllingClient.AgentId, 225 m_commsProvider.InterRegion.ExpectAvatarCrossing(reg.RegionHandle, avatar.ControllingClient.AgentId,
214 position, false); 226 position, false);
215 227
@@ -258,28 +270,24 @@ namespace OpenSim.Region.Environment.Scenes.Hypergrid
258 } 270 }
259 271
260 272
261 // Let's close some children agents
262 if (isHyperLink) // close them all
263 SendCloseChildAgentConnections(avatar.UUID, avatar.KnownChildRegionHandles);
264 else // close just a few
265 avatar.CloseChildAgents(newRegionX, newRegionY);
266
267 //avatar.Close(); 273 //avatar.Close();
268 274
269 // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone 275 // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone
270 /// 276 ///
271 /// Hypergrid mod: extra check for isHyperLink 277 /// Hypergrid mod: extra check for isHyperLink
272 /// 278 ///
273 //if (Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY)) 279 if (Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY) || isHyperLink)
274 //{ 280 {
275 // CloseConnection(avatar.UUID); 281 CloseConnection(avatar.UUID);
276 //} 282 }
277 // if (teleport success) // seems to be always success here 283 // if (teleport success) // seems to be always success here
278 // the user may change their profile information in other region, 284 // the user may change their profile information in other region,
279 // so the userinfo in UserProfileCache is not reliable any more, delete it 285 // so the userinfo in UserProfileCache is not reliable any more, delete it
280 if (avatar.Scene.NeedSceneCacheClear(avatar.UUID)) 286 if (avatar.Scene.NeedSceneCacheClear(avatar.UUID))
287 {
281 m_commsProvider.UserProfileCacheService.RemoveUser(avatar.UUID); 288 m_commsProvider.UserProfileCacheService.RemoveUser(avatar.UUID);
282 m_log.InfoFormat("[HGSceneCommService]: User {0} is going to another region, profile cache removed", avatar.UUID); 289 m_log.InfoFormat("[HGSceneCommService]: User {0} is going to another region, profile cache removed", avatar.UUID);
290 }
283 } 291 }
284 else 292 else
285 { 293 {
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
index 6ce19c6..9497043 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -2657,7 +2657,7 @@ namespace OpenSim.Region.Environment.Scenes
2657 GetAvatarAppearance(client, out appearance); 2657 GetAvatarAppearance(client, out appearance);
2658 2658
2659 ScenePresence avatar = m_sceneGraph.CreateAndAddChildScenePresence(client, appearance); 2659 ScenePresence avatar = m_sceneGraph.CreateAndAddChildScenePresence(client, appearance);
2660 avatar.KnownRegions = GetChildrenSeeds(avatar.UUID); 2660 //avatar.KnownRegions = GetChildrenSeeds(avatar.UUID);
2661 return avatar; 2661 return avatar;
2662 } 2662 }
2663 2663
@@ -2871,9 +2871,6 @@ namespace OpenSim.Region.Environment.Scenes
2871 /// <param name="agent"></param> 2871 /// <param name="agent"></param>
2872 public void NewUserConnection(AgentCircuitData agent) 2872 public void NewUserConnection(AgentCircuitData agent)
2873 { 2873 {
2874 m_log.DebugFormat("[CONNECTION DEBUGGING] Adding NewUserConnection for {0} in {1} with CC of {2}", agent.AgentID,
2875 RegionInfo.RegionName, agent.circuitcode);
2876
2877 if (m_regInfo.EstateSettings.IsBanned(agent.AgentID)) 2874 if (m_regInfo.EstateSettings.IsBanned(agent.AgentID))
2878 { 2875 {
2879 m_log.WarnFormat( 2876 m_log.WarnFormat(
@@ -2883,9 +2880,19 @@ namespace OpenSim.Region.Environment.Scenes
2883 2880
2884 /// Diva: Horrible stuff! 2881 /// Diva: Horrible stuff!
2885 capsPaths[agent.AgentID] = agent.CapsPath; 2882 capsPaths[agent.AgentID] = agent.CapsPath;
2886 //m_log.DebugFormat("------------>child seeds in {0}: {1}", RegionInfo.RegionName, ((agent.ChildrenCapSeeds == null) ? "null" : agent.ChildrenCapSeeds.Count.ToString()));
2887 childrenSeeds[agent.AgentID] = ((agent.ChildrenCapSeeds == null) ? new Dictionary<ulong, string>() : agent.ChildrenCapSeeds); 2883 childrenSeeds[agent.AgentID] = ((agent.ChildrenCapSeeds == null) ? new Dictionary<ulong, string>() : agent.ChildrenCapSeeds);
2888 2884
2885 ScenePresence sp = m_sceneGraph.GetScenePresence(agent.AgentID);
2886 if (sp != null)
2887 {
2888 m_log.DebugFormat("[CONNECTION DEBUGGING]: Updated agent {0} in {1}", agent.AgentID, RegionInfo.RegionName);
2889 sp.AdjustKnownSeeds();
2890 return;
2891 }
2892
2893 m_log.DebugFormat("[CONNECTION DEBUGGING]: Adding NewUserConnection for {0} in {1} with CC of {2}", agent.AgentID,
2894 RegionInfo.RegionName, agent.circuitcode);
2895
2889 AddCapsHandler(agent.AgentID); 2896 AddCapsHandler(agent.AgentID);
2890 2897
2891 if (!agent.child) 2898 if (!agent.child)
diff --git a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs
index b89f753..10b0759 100644
--- a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs
@@ -255,7 +255,7 @@ namespace OpenSim.Region.Environment.Scenes
255 #region Inform Client of Neighbours 255 #region Inform Client of Neighbours
256 256
257 private delegate void InformClientOfNeighbourDelegate( 257 private delegate void InformClientOfNeighbourDelegate(
258 ScenePresence avatar, AgentCircuitData a, SimpleRegionInfo reg, IPEndPoint endPoint); 258 ScenePresence avatar, AgentCircuitData a, SimpleRegionInfo reg, IPEndPoint endPoint, bool newAgent);
259 259
260 private void InformClientOfNeighbourCompleted(IAsyncResult iar) 260 private void InformClientOfNeighbourCompleted(IAsyncResult iar)
261 { 261 {
@@ -274,8 +274,12 @@ namespace OpenSim.Region.Environment.Scenes
274 /// <param name="regionHandle"></param> 274 /// <param name="regionHandle"></param>
275 /// <param name="endPoint"></param> 275 /// <param name="endPoint"></param>
276 private void InformClientOfNeighbourAsync(ScenePresence avatar, AgentCircuitData a, SimpleRegionInfo reg, 276 private void InformClientOfNeighbourAsync(ScenePresence avatar, AgentCircuitData a, SimpleRegionInfo reg,
277 IPEndPoint endPoint) 277 IPEndPoint endPoint, bool newAgent)
278 { 278 {
279 // Let's wait just a little to give time to originating regions to catch up with closing child agents
280 // after a cross here
281 Thread.Sleep(200);
282
279 uint x, y; 283 uint x, y;
280 Utils.LongToUInts(reg.RegionHandle, out x, out y); 284 Utils.LongToUInts(reg.RegionHandle, out x, out y);
281 x = x / Constants.RegionSize; 285 x = x / Constants.RegionSize;
@@ -287,7 +291,7 @@ namespace OpenSim.Region.Environment.Scenes
287 291
288 bool regionAccepted = m_commsProvider.InterRegion.InformRegionOfChildAgent(reg.RegionHandle, a); 292 bool regionAccepted = m_commsProvider.InterRegion.InformRegionOfChildAgent(reg.RegionHandle, a);
289 293
290 if (regionAccepted) 294 if (regionAccepted && newAgent)
291 { 295 {
292 IEventQueue eq = avatar.Scene.RequestModuleInterface<IEventQueue>(); 296 IEventQueue eq = avatar.Scene.RequestModuleInterface<IEventQueue>();
293 if (eq != null) 297 if (eq != null)
@@ -362,6 +366,7 @@ namespace OpenSim.Region.Environment.Scenes
362 366
363 /// Collect as many seeds as possible 367 /// Collect as many seeds as possible
364 Dictionary<ulong, string> seeds = new Dictionary<ulong, string>(avatar.Scene.GetChildrenSeeds(avatar.UUID)); 368 Dictionary<ulong, string> seeds = new Dictionary<ulong, string>(avatar.Scene.GetChildrenSeeds(avatar.UUID));
369 //Console.WriteLine(" !!! No. of seeds: " + seeds.Count);
365 if (!seeds.ContainsKey(avatar.Scene.RegionInfo.RegionHandle)) 370 if (!seeds.ContainsKey(avatar.Scene.RegionInfo.RegionHandle))
366 seeds.Add(avatar.Scene.RegionInfo.RegionHandle, avatar.ControllingClient.RequestClientInfo().CapsPath); 371 seeds.Add(avatar.Scene.RegionInfo.RegionHandle, avatar.ControllingClient.RequestClientInfo().CapsPath);
367 372
@@ -369,22 +374,26 @@ namespace OpenSim.Region.Environment.Scenes
369 List<AgentCircuitData> cagents = new List<AgentCircuitData>(); 374 List<AgentCircuitData> cagents = new List<AgentCircuitData>();
370 foreach (SimpleRegionInfo neighbour in neighbours) 375 foreach (SimpleRegionInfo neighbour in neighbours)
371 { 376 {
372 AgentCircuitData agent = avatar.ControllingClient.RequestClientInfo(); 377 if (neighbour.RegionHandle != avatar.Scene.RegionInfo.RegionHandle)
373 agent.BaseFolder = UUID.Zero;
374 agent.InventoryFolder = UUID.Zero;
375 agent.startpos = new Vector3(128, 128, 70);
376 agent.child = true;
377
378 if (newRegions.Contains(neighbour.RegionHandle))
379 { 378 {
380 agent.CapsPath = Util.GetRandomCapsPath();
381 avatar.AddNeighbourRegion(neighbour.RegionHandle, agent.CapsPath);
382 seeds.Add(neighbour.RegionHandle, agent.CapsPath);
383 }
384 else
385 agent.CapsPath = avatar.Scene.GetChildSeed(avatar.UUID, neighbour.RegionHandle);
386 379
387 cagents.Add(agent); 380 AgentCircuitData agent = avatar.ControllingClient.RequestClientInfo();
381 agent.BaseFolder = UUID.Zero;
382 agent.InventoryFolder = UUID.Zero;
383 agent.startpos = new Vector3(128, 128, 70);
384 agent.child = true;
385
386 if (newRegions.Contains(neighbour.RegionHandle))
387 {
388 agent.CapsPath = Util.GetRandomCapsPath();
389 avatar.AddNeighbourRegion(neighbour.RegionHandle, agent.CapsPath);
390 seeds.Add(neighbour.RegionHandle, agent.CapsPath);
391 }
392 else
393 agent.CapsPath = avatar.Scene.GetChildSeed(avatar.UUID, neighbour.RegionHandle);
394
395 cagents.Add(agent);
396 }
388 } 397 }
389 398
390 /// Update all child agent with everyone's seeds 399 /// Update all child agent with everyone's seeds
@@ -398,16 +407,22 @@ namespace OpenSim.Region.Environment.Scenes
398 //avatar.Scene.DumpChildrenSeeds(avatar.UUID); 407 //avatar.Scene.DumpChildrenSeeds(avatar.UUID);
399 //avatar.DumpKnownRegions(); 408 //avatar.DumpKnownRegions();
400 409
410 bool newAgent = false;
401 int count = 0; 411 int count = 0;
402 foreach (SimpleRegionInfo neighbour in neighbours) 412 foreach (SimpleRegionInfo neighbour in neighbours)
403 { 413 {
404 // Don't do it if there's already an agent in that region 414 // Don't do it if there's already an agent in that region
405 if (newRegions.Contains(neighbour.RegionHandle)) 415 if (newRegions.Contains(neighbour.RegionHandle))
416 newAgent = true;
417 else
418 newAgent = false;
419
420 if (neighbour.RegionHandle != avatar.Scene.RegionInfo.RegionHandle)
406 { 421 {
407 InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync; 422 InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync;
408 try 423 try
409 { 424 {
410 d.BeginInvoke(avatar, cagents[count], neighbour, neighbour.ExternalEndPoint, 425 d.BeginInvoke(avatar, cagents[count], neighbour, neighbour.ExternalEndPoint, newAgent,
411 InformClientOfNeighbourCompleted, 426 InformClientOfNeighbourCompleted,
412 d); 427 d);
413 } 428 }
@@ -429,11 +444,7 @@ namespace OpenSim.Region.Environment.Scenes
429 444
430 } 445 }
431 } 446 }
432 else
433 m_log.Debug("[SCM]: Skipping common neighbor " + neighbour.RegionLocX + ", " + neighbour.RegionLocY);
434
435 count++; 447 count++;
436
437 } 448 }
438 } 449 }
439 450
@@ -450,7 +461,7 @@ namespace OpenSim.Region.Environment.Scenes
450 agent.child = true; 461 agent.child = true;
451 462
452 InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync; 463 InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync;
453 d.BeginInvoke(avatar, agent, region, region.ExternalEndPoint, 464 d.BeginInvoke(avatar, agent, region, region.ExternalEndPoint, true,
454 InformClientOfNeighbourCompleted, 465 InformClientOfNeighbourCompleted,
455 d); 466 d);
456 } 467 }
@@ -748,6 +759,10 @@ namespace OpenSim.Region.Environment.Scenes
748 // once we reach here... 759 // once we reach here...
749 //avatar.Scene.RemoveCapsHandler(avatar.UUID); 760 //avatar.Scene.RemoveCapsHandler(avatar.UUID);
750 761
762 // Let's close some agents
763 avatar.CloseChildAgents(newRegionX, newRegionY);
764
765 string capsPath = String.Empty;
751 AgentCircuitData agent = avatar.ControllingClient.RequestClientInfo(); 766 AgentCircuitData agent = avatar.ControllingClient.RequestClientInfo();
752 agent.BaseFolder = UUID.Zero; 767 agent.BaseFolder = UUID.Zero;
753 agent.InventoryFolder = UUID.Zero; 768 agent.InventoryFolder = UUID.Zero;
@@ -757,36 +772,37 @@ namespace OpenSim.Region.Environment.Scenes
757 { 772 {
758 // brand new agent 773 // brand new agent
759 agent.CapsPath = Util.GetRandomCapsPath(); 774 agent.CapsPath = Util.GetRandomCapsPath();
775 if (!m_commsProvider.InterRegion.InformRegionOfChildAgent(reg.RegionHandle, agent))
776 {
777 avatar.ControllingClient.SendTeleportFailed("Destination is not accepting teleports.");
778 return;
779 }
780
781 // TODO Should construct this behind a method
782 capsPath =
783 "http://" + reg.ExternalHostName + ":" + reg.HttpPort
784 + "/CAPS/" + agent.CapsPath + "0000/";
785
786 if (eq != null)
787 {
788 OSD Item = EventQueueHelper.EnableSimulator(reg.RegionHandle, reg.ExternalEndPoint);
789 eq.Enqueue(Item, avatar.UUID);
790
791 Item = EventQueueHelper.EstablishAgentCommunication(avatar.UUID, reg.ExternalEndPoint.ToString(), capsPath);
792 eq.Enqueue(Item, avatar.UUID);
793 }
794 else
795 {
796 avatar.ControllingClient.InformClientOfNeighbour(reg.RegionHandle, reg.ExternalEndPoint);
797 }
760 } 798 }
761 else 799 else
762 { 800 {
763 // child agent already there
764 agent.CapsPath = avatar.Scene.GetChildSeed(avatar.UUID, reg.RegionHandle); 801 agent.CapsPath = avatar.Scene.GetChildSeed(avatar.UUID, reg.RegionHandle);
802 capsPath = "http://" + reg.ExternalHostName + ":" + reg.HttpPort
803 + "/CAPS/" + agent.CapsPath + "0000/";
765 } 804 }
766 805
767 if (!m_commsProvider.InterRegion.InformRegionOfChildAgent(reg.RegionHandle, agent))
768 {
769 avatar.ControllingClient.SendTeleportFailed("Destination is not accepting teleports.");
770 return;
771 }
772
773 // TODO Should construct this behind a method
774 string capsPath =
775 "http://" + reg.ExternalHostName + ":" + reg.HttpPort
776 + "/CAPS/" + agent.CapsPath + "0000/";
777
778 if (eq != null)
779 {
780 OSD Item = EventQueueHelper.EnableSimulator(reg.RegionHandle, reg.ExternalEndPoint);
781 eq.Enqueue(Item, avatar.UUID);
782
783 Item = EventQueueHelper.EstablishAgentCommunication(avatar.UUID, reg.ExternalEndPoint.ToString(), capsPath);
784 eq.Enqueue(Item, avatar.UUID);
785 }
786 else
787 {
788 avatar.ControllingClient.InformClientOfNeighbour(reg.RegionHandle, reg.ExternalEndPoint);
789 }
790 806
791 if (!m_commsProvider.InterRegion.ExpectAvatarCrossing(reg.RegionHandle, avatar.ControllingClient.AgentId, 807 if (!m_commsProvider.InterRegion.ExpectAvatarCrossing(reg.RegionHandle, avatar.ControllingClient.AgentId,
792 position, false)) 808 position, false))
@@ -826,24 +842,25 @@ namespace OpenSim.Region.Environment.Scenes
826 } 842 }
827 843
828 844
829 // Let's close some children agents
830 avatar.CloseChildAgents(newRegionX, newRegionY);
831 // Close this ScenePresence too
832 //avatar.Close();
833
834 // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone 845 // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone
835 846
836 //if (Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY)) 847 if (Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY))
837 //{ 848 {
838 // CloseConnection(avatar.UUID); 849 CloseConnection(avatar.UUID);
839 //} 850 }
840 851
841 // if (teleport success) // seems to be always success here 852 // if (teleport success) // seems to be always success here
842 // the user may change their profile information in other region, 853 // the user may change their profile information in other region,
843 // so the userinfo in UserProfileCache is not reliable any more, delete it 854 // so the userinfo in UserProfileCache is not reliable any more, delete it
844 if (avatar.Scene.NeedSceneCacheClear(avatar.UUID)) 855 if (avatar.Scene.NeedSceneCacheClear(avatar.UUID))
856 {
845 m_commsProvider.UserProfileCacheService.RemoveUser(avatar.UUID); 857 m_commsProvider.UserProfileCacheService.RemoveUser(avatar.UUID);
846 m_log.InfoFormat("User {0} is going to another region, profile cache removed", avatar.UUID); 858 m_log.InfoFormat("User {0} is going to another region, profile cache removed", avatar.UUID);
859 }
860
861 // Close this ScenePresence too
862 //avatar.Close();
863
847 } 864 }
848 else 865 else
849 { 866 {
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