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 | |
parent | Update svn properties. (diff) | |
download | opensim-SC-4b71b88114c6ac149571512c57ea005d85147f54.zip opensim-SC-4b71b88114c6ac149571512c57ea005d85147f54.tar.gz opensim-SC-4b71b88114c6ac149571512c57ea005d85147f54.tar.bz2 opensim-SC-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.
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 |