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/Hypergrid | |
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/Hypergrid')
-rw-r--r-- | OpenSim/Region/Environment/Scenes/Hypergrid/HGSceneCommunicationService.cs | 82 |
1 files changed, 45 insertions, 37 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 | { |