From f11a97f12d328af8bb39b92fec5cb5780983b66a Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 7 Jan 2010 15:53:55 -0800 Subject: * Finished SimulationServiceConnector * Started rerouting calls to UserService. * Compiles. May run. --- .../Framework/Scenes/SceneCommunicationService.cs | 34 +++++++++++++--------- 1 file changed, 20 insertions(+), 14 deletions(-) (limited to 'OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs') diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index f49d072..f612d17 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs @@ -57,7 +57,6 @@ namespace OpenSim.Region.Framework.Scenes private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); protected CommunicationsManager m_commsProvider; - protected IInterregionCommsOut m_interregionCommsOut; protected RegionInfo m_regionInfo; protected Scene m_scene; @@ -135,7 +134,6 @@ namespace OpenSim.Region.Framework.Scenes { m_scene = s; m_regionInfo = s.RegionInfo; - m_interregionCommsOut = m_scene.RequestModuleInterface(); } /// @@ -255,6 +253,7 @@ namespace OpenSim.Region.Framework.Scenes { InformClientOfNeighbourDelegate icon = (InformClientOfNeighbourDelegate) iar.AsyncState; icon.EndInvoke(iar); + m_log.WarnFormat(" --> InformClientOfNeighbourCompleted"); } /// @@ -285,8 +284,8 @@ namespace OpenSim.Region.Framework.Scenes string reason = String.Empty; - - bool regionAccepted = m_interregionCommsOut.SendCreateChildAgent(reg.RegionHandle, a, 0, out reason); + + bool regionAccepted = m_scene.SimulationService.CreateAgent(reg, a, 0, out reason); // m_interregionCommsOut.SendCreateChildAgent(reg.RegionHandle, a, 0, out reason); if (regionAccepted && newAgent) { @@ -460,6 +459,7 @@ namespace OpenSim.Region.Framework.Scenes int count = 0; foreach (GridRegion neighbour in neighbours) { + m_log.WarnFormat("--> Going to send child agent to {0}", neighbour.RegionName); // Don't do it if there's already an agent in that region if (newRegions.Contains(neighbour.RegionHandle)) newAgent = true; @@ -600,7 +600,10 @@ namespace OpenSim.Region.Framework.Scenes try { //m_commsProvider.InterRegion.ChildAgentUpdate(regionHandle, cAgentData); - m_interregionCommsOut.SendChildAgentUpdate(regionHandle, cAgentData); + uint x = 0, y = 0; + Utils.LongToUInts(regionHandle, out x, out y); + GridRegion destination = m_scene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y); + m_scene.SimulationService.UpdateAgent(destination, cAgentData); } catch { @@ -660,7 +663,10 @@ namespace OpenSim.Region.Framework.Scenes // let's do our best, but there's not much we can do if the neighbour doesn't accept. //m_commsProvider.InterRegion.TellRegionToCloseChildConnection(regionHandle, agentID); - m_interregionCommsOut.SendCloseAgent(regionHandle, agentID); + uint x = 0, y = 0; + Utils.LongToUInts(regionHandle, out x, out y); + GridRegion destination = m_scene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y); + m_scene.SimulationService.CloseAgent(destination, agentID); } private void SendCloseChildAgentCompleted(IAsyncResult iar) @@ -810,7 +816,7 @@ namespace OpenSim.Region.Framework.Scenes // Let's create an agent there if one doesn't exist yet. //if (!m_commsProvider.InterRegion.InformRegionOfChildAgent(reg.RegionHandle, agentCircuit)) - if (!m_interregionCommsOut.SendCreateChildAgent(reg.RegionHandle, agentCircuit, teleportFlags, out reason)) + if (!m_scene.SimulationService.CreateAgent(reg, agentCircuit, teleportFlags, out reason)) { avatar.ControllingClient.SendTeleportFailed(String.Format("Destination is not accepting teleports: {0}", reason)); @@ -896,9 +902,9 @@ namespace OpenSim.Region.Framework.Scenes avatar.CopyTo(agent); agent.Position = position; agent.CallbackURI = "http://" + m_regionInfo.ExternalHostName + ":" + m_regionInfo.HttpPort + - "/agent/" + avatar.UUID.ToString() + "/" + avatar.Scene.RegionInfo.RegionHandle.ToString() + "/release/"; + "/agent/" + avatar.UUID.ToString() + "/" + avatar.Scene.RegionInfo.RegionID.ToString() + "/release/"; - m_interregionCommsOut.SendChildAgentUpdate(reg.RegionHandle, agent); + m_scene.SimulationService.UpdateAgent(reg, agent); m_log.DebugFormat( "[CAPS]: Sending new CAPS seed url {0} to client {1}", capsPath, avatar.UUID); @@ -929,7 +935,7 @@ namespace OpenSim.Region.Framework.Scenes avatar.Scene.InformClientOfNeighbours(avatar); // Finally, kill the agent we just created at the destination. - m_interregionCommsOut.SendCloseAgent(reg.RegionHandle, avatar.UUID); + m_scene.SimulationService.CloseAgent(reg, avatar.UUID); return; } @@ -943,7 +949,7 @@ namespace OpenSim.Region.Framework.Scenes avatar.MakeChildAgent(); // CrossAttachmentsIntoNewRegion is a synchronous call. We shouldn't need to wait after it - avatar.CrossAttachmentsIntoNewRegion(reg.RegionHandle, true); + avatar.CrossAttachmentsIntoNewRegion(reg, true); // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone @@ -1338,9 +1344,9 @@ namespace OpenSim.Region.Framework.Scenes if (isFlying) cAgent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; cAgent.CallbackURI = "http://" + m_regionInfo.ExternalHostName + ":" + m_regionInfo.HttpPort + - "/agent/" + agent.UUID.ToString() + "/" + agent.Scene.RegionInfo.RegionHandle.ToString() + "/release/"; + "/agent/" + agent.UUID.ToString() + "/" + agent.Scene.RegionInfo.RegionID.ToString() + "/release/"; - m_interregionCommsOut.SendChildAgentUpdate(neighbourHandle, cAgent); + m_scene.SimulationService.UpdateAgent(neighbourRegion, cAgent); // Next, let's close the child agent connections that are too far away. agent.CloseChildAgents(neighbourx, neighboury); @@ -1391,7 +1397,7 @@ namespace OpenSim.Region.Framework.Scenes // now we have a child agent in this region. Request all interesting data about other (root) agents agent.SendInitialFullUpdateToAllClients(); - agent.CrossAttachmentsIntoNewRegion(neighbourHandle, true); + agent.CrossAttachmentsIntoNewRegion(neighbourRegion, true); // m_scene.SendKillObject(m_localId); -- cgit v1.1 From b63405c1a796b44b58081857d01f726372467628 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Fri, 8 Jan 2010 10:43:34 -0800 Subject: Inching ahead... This compiles, but very likely does not run. --- OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs | 5 ----- 1 file changed, 5 deletions(-) (limited to 'OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs') diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index f612d17..53693e4 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs @@ -1455,11 +1455,6 @@ namespace OpenSim.Region.Framework.Scenes m_commsProvider.LogOffUser(userid, regionid, regionhandle, posx, posy, posz); } - public void ClearUserAgent(UUID avatarID) - { - m_commsProvider.UserService.ClearUserAgent(avatarID); - } - public void AddNewUserFriend(UUID friendlistowner, UUID friend, uint perms) { m_commsProvider.AddNewUserFriend(friendlistowner, friend, perms); -- cgit v1.1 From 6b60f3cce5b9dc8c005c9fdb53731dc4e3e45ee8 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Fri, 8 Jan 2010 20:31:29 -0800 Subject: A few more inches... Old friends things removed. Less references to UserProfileService. --- .../Framework/Scenes/SceneCommunicationService.cs | 19 ------------------- 1 file changed, 19 deletions(-) (limited to 'OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs') diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index 53693e4..8b14f61 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs @@ -1455,25 +1455,6 @@ namespace OpenSim.Region.Framework.Scenes m_commsProvider.LogOffUser(userid, regionid, regionhandle, posx, posy, posz); } - public void AddNewUserFriend(UUID friendlistowner, UUID friend, uint perms) - { - m_commsProvider.AddNewUserFriend(friendlistowner, friend, perms); - } - - public void UpdateUserFriendPerms(UUID friendlistowner, UUID friend, uint perms) - { - m_commsProvider.UpdateUserFriendPerms(friendlistowner, friend, perms); - } - - public void RemoveUserFriend(UUID friendlistowner, UUID friend) - { - m_commsProvider.RemoveUserFriend(friendlistowner, friend); - } - - public List GetUserFriendList(UUID friendlistowner) - { - return m_commsProvider.GetUserFriendList(friendlistowner); - } public List GenerateAgentPickerRequestResponse(UUID queryID, string query) { -- cgit v1.1 From 1e1b2ab221851efc414678b7ea52ef2ca788ce9f Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 10 Jan 2010 10:40:07 -0800 Subject: * OMG! All but one references to UserProfileCacheService have been rerouted! * HG is seriously broken here * Compiles. Untested. --- OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs') diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index 8b14f61..ce3c16c 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs @@ -967,9 +967,10 @@ namespace OpenSim.Region.Framework.Scenes // if (teleport success) // seems to be always success here // the user may change their profile information in other region, // so the userinfo in UserProfileCache is not reliable any more, delete it + + // REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE! if (avatar.Scene.NeedSceneCacheClear(avatar.UUID)) { - m_commsProvider.UserProfileCacheService.RemoveUser(avatar.UUID); m_log.DebugFormat( "[SCENE COMMUNICATION SERVICE]: User {0} is going to another region, profile cache removed", avatar.UUID); @@ -1404,11 +1405,11 @@ namespace OpenSim.Region.Framework.Scenes agent.Scene.NotifyMyCoarseLocationChange(); // the user may change their profile information in other region, // so the userinfo in UserProfileCache is not reliable any more, delete it + // REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE! if (agent.Scene.NeedSceneCacheClear(agent.UUID)) { - agent.Scene.CommsManager.UserProfileCacheService.RemoveUser(agent.UUID); m_log.DebugFormat( - "[SCENE COMM]: User {0} is going to another region, profile cache removed", agent.UUID); + "[SCENE COMM]: User {0} is going to another region", agent.UUID); } } -- cgit v1.1 From 4dd523b45d1e635c66eb4e556764fabe29dbfc58 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 10 Jan 2010 15:34:56 -0800 Subject: * Changed IPresenceService Logout, so that it takes a position and a lookat * CommsManager.AvatarService rerouted --- .../Region/Framework/Scenes/SceneCommunicationService.cs | 13 ------------- 1 file changed, 13 deletions(-) (limited to 'OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs') diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index ce3c16c..04ecb5f 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs @@ -1444,19 +1444,6 @@ namespace OpenSim.Region.Framework.Scenes //m_log.DebugFormat("[SCENE COMM]: Crossing agent {0} {1} completed.", agent.Firstname, agent.Lastname); } - - public void LogOffUser(UUID userid, UUID regionid, ulong regionhandle, Vector3 position, Vector3 lookat) - { - m_commsProvider.LogOffUser(userid, regionid, regionhandle, position, lookat); - } - - // deprecated as of 2008-08-27 - public void LogOffUser(UUID userid, UUID regionid, ulong regionhandle, float posx, float posy, float posz) - { - m_commsProvider.LogOffUser(userid, regionid, regionhandle, posx, posy, posz); - } - - public List GenerateAgentPickerRequestResponse(UUID queryID, string query) { return m_commsProvider.GenerateAgentPickerRequestResponse(queryID, query); -- cgit v1.1 From 0c2946031bccf75c28968b6adcde5cce5bc45c13 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 10 Jan 2010 19:42:36 -0800 Subject: CommunicationsManager is practically empty. Only NetworkServersInfo is there. --- OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) (limited to 'OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs') diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index 04ecb5f..2e82748 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs @@ -1443,12 +1443,7 @@ namespace OpenSim.Region.Framework.Scenes //m_log.DebugFormat("[SCENE COMM]: Crossing agent {0} {1} completed.", agent.Firstname, agent.Lastname); } - - public List GenerateAgentPickerRequestResponse(UUID queryID, string query) - { - return m_commsProvider.GenerateAgentPickerRequestResponse(queryID, query); - } - + public List RequestNamedRegions(string name, int maxNumber) { return m_scene.GridService.GetRegionsByName(UUID.Zero, name, maxNumber); -- cgit v1.1 From 001d3695683d9511446d194feeb763c437170028 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Mon, 11 Jan 2010 07:45:47 -0800 Subject: CommunicationsManager deleted. --- OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs') diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index 2e82748..269bd4a 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs @@ -56,7 +56,6 @@ namespace OpenSim.Region.Framework.Scenes { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - protected CommunicationsManager m_commsProvider; protected RegionInfo m_regionInfo; protected Scene m_scene; @@ -124,9 +123,8 @@ namespace OpenSim.Region.Framework.Scenes public KiPrimitiveDelegate KiPrimitive; - public SceneCommunicationService(CommunicationsManager commsMan) + public SceneCommunicationService() { - m_commsProvider = commsMan; m_agentsInTransit = new List(); } -- cgit v1.1 From c5ea783526611a968400a1936e4c6764ee1c7013 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Mon, 11 Jan 2010 07:51:33 -0800 Subject: OpenSim/Framework/Communications/Cache deleted. LibraryRootFolder deleted. --- OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs | 1 - 1 file changed, 1 deletion(-) (limited to 'OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs') diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index 269bd4a..7d9b427 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs @@ -36,7 +36,6 @@ using log4net; using OpenSim.Framework; using OpenSim.Framework.Client; using OpenSim.Framework.Communications; -using OpenSim.Framework.Communications.Cache; using OpenSim.Framework.Capabilities; using OpenSim.Region.Framework.Interfaces; using OpenSim.Services.Interfaces; -- cgit v1.1 From 77e43f480154b0a950d9d5f54df5c225fc64e77a Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Mon, 11 Jan 2010 17:30:05 -0800 Subject: Fixed a couple of bugs with Appearance. Appearance is all good now. --- OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs') diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index 7d9b427..11cb8cd 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs @@ -250,7 +250,7 @@ namespace OpenSim.Region.Framework.Scenes { InformClientOfNeighbourDelegate icon = (InformClientOfNeighbourDelegate) iar.AsyncState; icon.EndInvoke(iar); - m_log.WarnFormat(" --> InformClientOfNeighbourCompleted"); + //m_log.WarnFormat(" --> InformClientOfNeighbourCompleted"); } /// @@ -456,7 +456,7 @@ namespace OpenSim.Region.Framework.Scenes int count = 0; foreach (GridRegion neighbour in neighbours) { - m_log.WarnFormat("--> Going to send child agent to {0}", neighbour.RegionName); + //m_log.WarnFormat("--> Going to send child agent to {0}", neighbour.RegionName); // Don't do it if there's already an agent in that region if (newRegions.Contains(neighbour.RegionHandle)) newAgent = true; -- cgit v1.1 From 011a1b3798016af355ffa352dc93667429749341 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Tue, 12 Jan 2010 09:49:27 -0800 Subject: More appearance woes fixed, this time for child agents. Tested on a grid with 2 simulators. Everything seems to be working, including border crosses. TPs (prim crossing) need love now. --- OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs') diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index 11cb8cd..1e7f54a 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs @@ -423,6 +423,7 @@ namespace OpenSim.Region.Framework.Scenes agent.InventoryFolder = UUID.Zero; agent.startpos = new Vector3(128, 128, 70); agent.child = true; + agent.Appearance = avatar.Appearance; if (newRegions.Contains(neighbour.RegionHandle)) { @@ -515,6 +516,9 @@ namespace OpenSim.Region.Framework.Scenes agent.InventoryFolder = UUID.Zero; agent.startpos = new Vector3(128, 128, 70); agent.child = true; + if (avatar.Appearance == null) + m_log.Debug("XXX Appearance is null!!!!"); + agent.Appearance = avatar.Appearance; InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync; d.BeginInvoke(avatar, agent, region, region.ExternalEndPoint, true, -- cgit v1.1 From 7356860b487febd12c2e0de2f009a6df9ea0aeec Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Wed, 13 Jan 2010 09:17:30 -0800 Subject: Several more buglets removed. --- .../Framework/Scenes/SceneCommunicationService.cs | 29 ++++++++++------------ 1 file changed, 13 insertions(+), 16 deletions(-) (limited to 'OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs') diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index 1e7f54a..63719ac 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs @@ -414,7 +414,7 @@ namespace OpenSim.Region.Framework.Scenes /// Create the necessary child agents List cagents = new List(); foreach (GridRegion neighbour in neighbours) - { + { if (neighbour.RegionHandle != avatar.Scene.RegionInfo.RegionHandle) { @@ -446,7 +446,6 @@ namespace OpenSim.Region.Framework.Scenes if (avatar.Scene.CapsModule != null) { - // These two are the same thing! avatar.Scene.CapsModule.SetChildrenSeed(avatar.UUID, seeds); } avatar.KnownRegions = seeds; @@ -516,8 +515,6 @@ namespace OpenSim.Region.Framework.Scenes agent.InventoryFolder = UUID.Zero; agent.startpos = new Vector3(128, 128, 70); agent.child = true; - if (avatar.Appearance == null) - m_log.Debug("XXX Appearance is null!!!!"); agent.Appearance = avatar.Appearance; InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync; @@ -1450,17 +1447,17 @@ namespace OpenSim.Region.Framework.Scenes return m_scene.GridService.GetRegionsByName(UUID.Zero, name, maxNumber); } - //private void Dump(string msg, List handles) - //{ - // m_log.InfoFormat("-------------- HANDLE DUMP ({0}) ---------", msg); - // foreach (ulong handle in handles) - // { - // uint x, y; - // Utils.LongToUInts(handle, out x, out y); - // x = x / Constants.RegionSize; - // y = y / Constants.RegionSize; - // m_log.InfoFormat("({0}, {1})", x, y); - // } - //} + private void Dump(string msg, List handles) + { + m_log.InfoFormat("-------------- HANDLE DUMP ({0}) ---------", msg); + foreach (ulong handle in handles) + { + uint x, y; + Utils.LongToUInts(handle, out x, out y); + x = x / Constants.RegionSize; + y = y / Constants.RegionSize; + m_log.InfoFormat("({0}, {1})", x, y); + } + } } } -- cgit v1.1 From 4de82891a9c1219fd798fc005f5dea4dc7ea13f2 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Wed, 13 Jan 2010 09:34:08 -0800 Subject: Bug in Teleport fixed -- Appearance was missing from AgentCircuitData. --- OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs | 1 + 1 file changed, 1 insertion(+) (limited to 'OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs') diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index 63719ac..f99df29 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs @@ -803,6 +803,7 @@ namespace OpenSim.Region.Framework.Scenes agentCircuit.InventoryFolder = UUID.Zero; agentCircuit.startpos = position; agentCircuit.child = true; + agentCircuit.Appearance = avatar.Appearance; if (Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY)) { -- cgit v1.1 From f1c30784ac767bf5f62e81748984b76d85d71f6a Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Fri, 15 Jan 2010 15:11:58 -0800 Subject: * General cleanup of Teleports, Crossings and Child agents. They are now in the new AgentTransferModule, in line with what MW started implementing back in May -- ITeleportModule. This has been renamed IAgentTransferModule, to be more generic. * HGSceneCommunicationService has been deleted * SceneCommunicationService will likely be deleted soon too --- .../Framework/Scenes/SceneCommunicationService.cs | 1149 -------------------- 1 file changed, 1149 deletions(-) (limited to 'OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs') diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index f99df29..a67b42a 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs @@ -60,8 +60,6 @@ namespace OpenSim.Region.Framework.Scenes protected RegionCommsListener regionCommsHost; - protected List m_agentsInTransit; - public bool RegionLoginsEnabled { get { return m_regionLoginsEnabled; } @@ -124,7 +122,6 @@ namespace OpenSim.Region.Framework.Scenes public SceneCommunicationService() { - m_agentsInTransit = new List(); } public void SetScene(Scene s) @@ -150,381 +147,6 @@ namespace OpenSim.Region.Framework.Scenes { } - #region CommsManager Event handlers - - /// - /// A New User will arrive shortly, Informs the scene that there's a new user on the way - /// - /// Data we need to ensure that the agent can connect - /// - protected void NewUserConnection(AgentCircuitData agent) - { - handlerExpectUser = OnExpectUser; - if (handlerExpectUser != null) - { - //m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: OnExpectUser Fired for User:" + agent.firstname + " " + agent.lastname); - handlerExpectUser(agent); - } - } - - /// - /// The Grid has requested us to log-off the user - /// - /// Unique ID of agent to log-off - /// The secret string that the region establishes with the grid when registering - /// The message to send to the user that tells them why they were logged off - protected void GridLogOffUser(UUID AgentID, UUID RegionSecret, string message) - { - handlerLogOffUser = OnLogOffUser; - if (handlerLogOffUser != null) - { - handlerLogOffUser(AgentID, RegionSecret, message); - } - } - - /// - /// Inform the scene that we've got an update about a child agent that we have - /// - /// - /// - protected bool ChildAgentUpdate(ChildAgentDataUpdate cAgentData) - { - handlerChildAgentUpdate = OnChildAgentUpdate; - if (handlerChildAgentUpdate != null) - handlerChildAgentUpdate(cAgentData); - - - return true; - } - - - protected void AgentCrossing(UUID agentID, Vector3 position, bool isFlying) - { - handlerAvatarCrossingIntoRegion = OnAvatarCrossingIntoRegion; - if (handlerAvatarCrossingIntoRegion != null) - { - handlerAvatarCrossingIntoRegion(agentID, position, isFlying); - } - } - - protected void PrimCrossing(UUID primID, Vector3 position, bool isPhysical) - { - handlerPrimCrossingIntoRegion = OnPrimCrossingIntoRegion; - if (handlerPrimCrossingIntoRegion != null) - { - handlerPrimCrossingIntoRegion(primID, position, isPhysical); - } - } - - protected bool CloseConnection(UUID agentID) - { - m_log.Debug("[INTERREGION]: Incoming Agent Close Request for agent: " + agentID); - - handlerCloseAgentConnection = OnCloseAgentConnection; - if (handlerCloseAgentConnection != null) - { - return handlerCloseAgentConnection(agentID); - } - - return false; - } - - protected LandData FetchLandData(uint x, uint y) - { - handlerGetLandData = OnGetLandData; - if (handlerGetLandData != null) - { - return handlerGetLandData(x, y); - } - return null; - } - - #endregion - - #region Inform Client of Neighbours - - private delegate void InformClientOfNeighbourDelegate( - ScenePresence avatar, AgentCircuitData a, GridRegion reg, IPEndPoint endPoint, bool newAgent); - - private void InformClientOfNeighbourCompleted(IAsyncResult iar) - { - InformClientOfNeighbourDelegate icon = (InformClientOfNeighbourDelegate) iar.AsyncState; - icon.EndInvoke(iar); - //m_log.WarnFormat(" --> InformClientOfNeighbourCompleted"); - } - - /// - /// Async component for informing client of which neighbours exist - /// - /// - /// This needs to run asynchronously, as a network timeout may block the thread for a long while - /// - /// - /// - /// - /// - private void InformClientOfNeighbourAsync(ScenePresence avatar, AgentCircuitData a, GridRegion reg, - IPEndPoint endPoint, bool newAgent) - { - // Let's wait just a little to give time to originating regions to catch up with closing child agents - // after a cross here - Thread.Sleep(500); - - uint x, y; - Utils.LongToUInts(reg.RegionHandle, out x, out y); - x = x / Constants.RegionSize; - y = y / Constants.RegionSize; - m_log.Info("[INTERGRID]: Starting to inform client about neighbour " + x + ", " + y + "(" + endPoint.ToString() + ")"); - - string capsPath = "http://" + reg.ExternalHostName + ":" + reg.HttpPort - + "/CAPS/" + a.CapsPath + "0000/"; - - string reason = String.Empty; - - - bool regionAccepted = m_scene.SimulationService.CreateAgent(reg, a, 0, out reason); // m_interregionCommsOut.SendCreateChildAgent(reg.RegionHandle, a, 0, out reason); - - if (regionAccepted && newAgent) - { - IEventQueue eq = avatar.Scene.RequestModuleInterface(); - if (eq != null) - { - #region IP Translation for NAT - IClientIPEndpoint ipepClient; - if (avatar.ClientView.TryGet(out ipepClient)) - { - endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address); - } - #endregion - - eq.EnableSimulator(reg.RegionHandle, endPoint, avatar.UUID); - eq.EstablishAgentCommunication(avatar.UUID, endPoint, capsPath); - m_log.DebugFormat("[CAPS]: Sending new CAPS seed url {0} to client {1} in region {2}", - capsPath, avatar.UUID, avatar.Scene.RegionInfo.RegionName); - } - else - { - avatar.ControllingClient.InformClientOfNeighbour(reg.RegionHandle, endPoint); - // TODO: make Event Queue disablable! - } - - m_log.Info("[INTERGRID]: Completed inform client about neighbour " + endPoint.ToString()); - - } - - } - - public List RequestNeighbours(Scene pScene, uint pRegionLocX, uint pRegionLocY) - { - Border[] northBorders = pScene.NorthBorders.ToArray(); - Border[] southBorders = pScene.SouthBorders.ToArray(); - Border[] eastBorders = pScene.EastBorders.ToArray(); - Border[] westBorders = pScene.WestBorders.ToArray(); - - // Legacy one region. Provided for simplicity while testing the all inclusive method in the else statement. - if (northBorders.Length <= 1 && southBorders.Length <= 1 && eastBorders.Length <= 1 && westBorders.Length <= 1) - { - return m_scene.GridService.GetNeighbours(m_regionInfo.ScopeID, m_regionInfo.RegionID); - } - else - { - Vector2 extent = Vector2.Zero; - for (int i = 0; i < eastBorders.Length; i++) - { - extent.X = (eastBorders[i].BorderLine.Z > extent.X) ? eastBorders[i].BorderLine.Z : extent.X; - } - for (int i = 0; i < northBorders.Length; i++) - { - extent.Y = (northBorders[i].BorderLine.Z > extent.Y) ? northBorders[i].BorderLine.Z : extent.Y; - } - - // Loss of fraction on purpose - extent.X = ((int)extent.X / (int)Constants.RegionSize) + 1; - extent.Y = ((int)extent.Y / (int)Constants.RegionSize) + 1; - - int startX = (int)(pRegionLocX - 1) * (int)Constants.RegionSize; - int startY = (int)(pRegionLocY - 1) * (int)Constants.RegionSize; - - int endX = ((int)pRegionLocX + (int)extent.X) * (int)Constants.RegionSize; - int endY = ((int)pRegionLocY + (int)extent.Y) * (int)Constants.RegionSize; - - List neighbours = m_scene.GridService.GetRegionRange(m_regionInfo.ScopeID, startX, endX, startY, endY); - neighbours.RemoveAll(delegate(GridRegion r) { return r.RegionID == m_regionInfo.RegionID; }); - - return neighbours; - } - } - - /// - /// This informs all neighboring regions about agent "avatar". - /// Calls an asynchronous method to do so.. so it doesn't lag the sim. - /// - public void EnableNeighbourChildAgents(ScenePresence avatar, List lstneighbours) - { - List neighbours = new List(); - - if (m_regionInfo != null) - { - neighbours = RequestNeighbours(avatar.Scene,m_regionInfo.RegionLocX, m_regionInfo.RegionLocY); - } - else - { - m_log.Debug("[ENABLENEIGHBOURCHILDAGENTS]: m_regionInfo was null in EnableNeighbourChildAgents, is this a NPC?"); - } - - /// We need to find the difference between the new regions where there are no child agents - /// and the regions where there are already child agents. We only send notification to the former. - List neighbourHandles = NeighbourHandles(neighbours); // on this region - neighbourHandles.Add(avatar.Scene.RegionInfo.RegionHandle); // add this region too - List previousRegionNeighbourHandles ; - - if (avatar.Scene.CapsModule != null) - { - previousRegionNeighbourHandles = - new List(avatar.Scene.CapsModule.GetChildrenSeeds(avatar.UUID).Keys); - } - else - { - previousRegionNeighbourHandles = new List(); - } - - List newRegions = NewNeighbours(neighbourHandles, previousRegionNeighbourHandles); - List oldRegions = OldNeighbours(neighbourHandles, previousRegionNeighbourHandles); - - //Dump("Current Neighbors", neighbourHandles); - //Dump("Previous Neighbours", previousRegionNeighbourHandles); - //Dump("New Neighbours", newRegions); - //Dump("Old Neighbours", oldRegions); - - /// Update the scene presence's known regions here on this region - avatar.DropOldNeighbours(oldRegions); - - /// Collect as many seeds as possible - Dictionary seeds; - if (avatar.Scene.CapsModule != null) - seeds - = new Dictionary(avatar.Scene.CapsModule.GetChildrenSeeds(avatar.UUID)); - else - seeds = new Dictionary(); - - //m_log.Debug(" !!! No. of seeds: " + seeds.Count); - if (!seeds.ContainsKey(avatar.Scene.RegionInfo.RegionHandle)) - seeds.Add(avatar.Scene.RegionInfo.RegionHandle, avatar.ControllingClient.RequestClientInfo().CapsPath); - - /// Create the necessary child agents - List cagents = new List(); - foreach (GridRegion neighbour in neighbours) - { - if (neighbour.RegionHandle != avatar.Scene.RegionInfo.RegionHandle) - { - - AgentCircuitData agent = avatar.ControllingClient.RequestClientInfo(); - agent.BaseFolder = UUID.Zero; - agent.InventoryFolder = UUID.Zero; - agent.startpos = new Vector3(128, 128, 70); - agent.child = true; - agent.Appearance = avatar.Appearance; - - if (newRegions.Contains(neighbour.RegionHandle)) - { - agent.CapsPath = CapsUtil.GetRandomCapsObjectPath(); - avatar.AddNeighbourRegion(neighbour.RegionHandle, agent.CapsPath); - seeds.Add(neighbour.RegionHandle, agent.CapsPath); - } - else - agent.CapsPath = avatar.Scene.CapsModule.GetChildSeed(avatar.UUID, neighbour.RegionHandle); - - cagents.Add(agent); - } - } - - /// Update all child agent with everyone's seeds - foreach (AgentCircuitData a in cagents) - { - a.ChildrenCapSeeds = new Dictionary(seeds); - } - - if (avatar.Scene.CapsModule != null) - { - avatar.Scene.CapsModule.SetChildrenSeed(avatar.UUID, seeds); - } - avatar.KnownRegions = seeds; - //avatar.Scene.DumpChildrenSeeds(avatar.UUID); - //avatar.DumpKnownRegions(); - - bool newAgent = false; - int count = 0; - foreach (GridRegion neighbour in neighbours) - { - //m_log.WarnFormat("--> Going to send child agent to {0}", neighbour.RegionName); - // Don't do it if there's already an agent in that region - if (newRegions.Contains(neighbour.RegionHandle)) - newAgent = true; - else - newAgent = false; - - if (neighbour.RegionHandle != avatar.Scene.RegionInfo.RegionHandle) - { - InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync; - try - { - d.BeginInvoke(avatar, cagents[count], neighbour, neighbour.ExternalEndPoint, newAgent, - InformClientOfNeighbourCompleted, - d); - } - - catch (ArgumentOutOfRangeException) - { - m_log.ErrorFormat( - "[REGIONINFO]: Neighbour Regions response included the current region in the neighbor list. The following region will not display to the client: {0} for region {1} ({2}, {3}).", - neighbour.ExternalHostName, - neighbour.RegionHandle, - neighbour.RegionLocX, - neighbour.RegionLocY); - } - catch (Exception e) - { - m_log.ErrorFormat( - "[REGIONINFO]: Could not resolve external hostname {0} for region {1} ({2}, {3}). {4}", - neighbour.ExternalHostName, - neighbour.RegionHandle, - neighbour.RegionLocX, - neighbour.RegionLocY, - e); - - // FIXME: Okay, even though we've failed, we're still going to throw the exception on, - // since I don't know what will happen if we just let the client continue - - // XXX: Well, decided to swallow the exception instead for now. Let us see how that goes. - // throw e; - - } - } - count++; - } - } - - /// - /// This informs a single neighboring region about agent "avatar". - /// Calls an asynchronous method to do so.. so it doesn't lag the sim. - /// - public void InformNeighborChildAgent(ScenePresence avatar, GridRegion region) - { - AgentCircuitData agent = avatar.ControllingClient.RequestClientInfo(); - agent.BaseFolder = UUID.Zero; - agent.InventoryFolder = UUID.Zero; - agent.startpos = new Vector3(128, 128, 70); - agent.child = true; - agent.Appearance = avatar.Appearance; - - InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync; - d.BeginInvoke(avatar, agent, region, region.ExternalEndPoint, true, - InformClientOfNeighbourCompleted, - d); - } - - #endregion - public delegate void InformNeighbourThatRegionUpDelegate(INeighbourService nService, RegionInfo region, ulong regionhandle); private void InformNeighborsThatRegionisUpCompleted(IAsyncResult iar) @@ -683,782 +305,11 @@ namespace OpenSim.Region.Framework.Scenes d); } } - - - /// - /// Try to teleport an agent to a new region. - /// - /// - /// - /// - /// - /// - public virtual void RequestTeleportToLocation(ScenePresence avatar, ulong regionHandle, Vector3 position, - Vector3 lookAt, uint teleportFlags) - { - if (!avatar.Scene.Permissions.CanTeleport(avatar.UUID)) - return; - - bool destRegionUp = true; - - IEventQueue eq = avatar.Scene.RequestModuleInterface(); - - // Reset animations; the viewer does that in teleports. - avatar.Animator.ResetAnimations(); - - if (regionHandle == m_regionInfo.RegionHandle) - { - m_log.DebugFormat( - "[SCENE COMMUNICATION SERVICE]: RequestTeleportToLocation {0} within {1}", - position, m_regionInfo.RegionName); - - // Teleport within the same region - if (IsOutsideRegion(avatar.Scene, position) || position.Z < 0) - { - Vector3 emergencyPos = new Vector3(128, 128, 128); - - m_log.WarnFormat( - "[SCENE COMMUNICATION SERVICE]: RequestTeleportToLocation() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}", - position, avatar.Name, avatar.UUID, emergencyPos); - position = emergencyPos; - } - - // TODO: Get proper AVG Height - float localAVHeight = 1.56f; - float posZLimit = 22; - - // TODO: Check other Scene HeightField - if (position.X > 0 && position.X <= (int)Constants.RegionSize && position.Y > 0 && position.Y <=(int)Constants.RegionSize) - { - posZLimit = (float) avatar.Scene.Heightmap[(int) position.X, (int) position.Y]; - } - - float newPosZ = posZLimit + localAVHeight; - if (posZLimit >= (position.Z - (localAVHeight / 2)) && !(Single.IsInfinity(newPosZ) || Single.IsNaN(newPosZ))) - { - position.Z = newPosZ; - } - - // Only send this if the event queue is null - if (eq == null) - avatar.ControllingClient.SendTeleportLocationStart(); - - avatar.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags); - avatar.Teleport(position); - } - else - { - uint x = 0, y = 0; - Utils.LongToUInts(regionHandle, out x, out y); - GridRegion reg = m_scene.GridService.GetRegionByPosition(m_scene.RegionInfo.ScopeID, (int)x, (int)y); - - if (reg != null) - { - m_log.DebugFormat( - "[SCENE COMMUNICATION SERVICE]: RequestTeleportToLocation to {0} in {1}", - position, reg.RegionName); - - if (eq == null) - avatar.ControllingClient.SendTeleportLocationStart(); - - // Let's do DNS resolution only once in this process, please! - // This may be a costly operation. The reg.ExternalEndPoint field is not a passive field, - // it's actually doing a lot of work. - IPEndPoint endPoint = reg.ExternalEndPoint; - if (endPoint.Address == null) - { - // Couldn't resolve the name. Can't TP, because the viewer wants IP addresses. - destRegionUp = false; - } - - if (destRegionUp) - { - uint newRegionX = (uint)(reg.RegionHandle >> 40); - uint newRegionY = (((uint)(reg.RegionHandle)) >> 8); - uint oldRegionX = (uint)(m_regionInfo.RegionHandle >> 40); - uint oldRegionY = (((uint)(m_regionInfo.RegionHandle)) >> 8); - - // Fixing a bug where teleporting while sitting results in the avatar ending up removed from - // both regions - if (avatar.ParentID != (uint)0) - avatar.StandUp(); - - if (!avatar.ValidateAttachments()) - { - avatar.ControllingClient.SendTeleportFailed("Inconsistent attachment state"); - return; - } - - // the avatar.Close below will clear the child region list. We need this below for (possibly) - // closing the child agents, so save it here (we need a copy as it is Clear()-ed). - //List childRegions = new List(avatar.GetKnownRegionList()); - // Compared to ScenePresence.CrossToNewRegion(), there's no obvious code to handle a teleport - // failure at this point (unlike a border crossing failure). So perhaps this can never fail - // once we reach here... - //avatar.Scene.RemoveCapsHandler(avatar.UUID); - - string capsPath = String.Empty; - AgentCircuitData agentCircuit = avatar.ControllingClient.RequestClientInfo(); - agentCircuit.BaseFolder = UUID.Zero; - agentCircuit.InventoryFolder = UUID.Zero; - agentCircuit.startpos = position; - agentCircuit.child = true; - agentCircuit.Appearance = avatar.Appearance; - - if (Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY)) - { - // brand new agent, let's create a new caps seed - agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath(); - } - - string reason = String.Empty; - - // Let's create an agent there if one doesn't exist yet. - //if (!m_commsProvider.InterRegion.InformRegionOfChildAgent(reg.RegionHandle, agentCircuit)) - if (!m_scene.SimulationService.CreateAgent(reg, agentCircuit, teleportFlags, out reason)) - { - avatar.ControllingClient.SendTeleportFailed(String.Format("Destination is not accepting teleports: {0}", - reason)); - return; - } - - // OK, it got this agent. Let's close some child agents - avatar.CloseChildAgents(newRegionX, newRegionY); - - if (Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY)) - { - #region IP Translation for NAT - IClientIPEndpoint ipepClient; - if (avatar.ClientView.TryGet(out ipepClient)) - { - capsPath - = "http://" - + NetworkUtil.GetHostFor(ipepClient.EndPoint, reg.ExternalHostName) - + ":" - + reg.HttpPort - + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath); - } - else - { - capsPath - = "http://" - + reg.ExternalHostName - + ":" - + reg.HttpPort - + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath); - } - #endregion - - if (eq != null) - { - #region IP Translation for NAT - // Uses ipepClient above - if (avatar.ClientView.TryGet(out ipepClient)) - { - endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address); - } - #endregion - - eq.EnableSimulator(reg.RegionHandle, endPoint, avatar.UUID); - - // ES makes the client send a UseCircuitCode message to the destination, - // which triggers a bunch of things there. - // So let's wait - Thread.Sleep(2000); - - eq.EstablishAgentCommunication(avatar.UUID, endPoint, capsPath); - } - else - { - avatar.ControllingClient.InformClientOfNeighbour(reg.RegionHandle, endPoint); - } - } - else - { - agentCircuit.CapsPath = avatar.Scene.CapsModule.GetChildSeed(avatar.UUID, reg.RegionHandle); - capsPath = "http://" + reg.ExternalHostName + ":" + reg.HttpPort - + "/CAPS/" + agentCircuit.CapsPath + "0000/"; - } - - // Expect avatar crossing is a heavy-duty function at the destination. - // That is where MakeRoot is called, which fetches appearance and inventory. - // Plus triggers OnMakeRoot, which spawns a series of asynchronous updates. - //m_commsProvider.InterRegion.ExpectAvatarCrossing(reg.RegionHandle, avatar.ControllingClient.AgentId, - // position, false); - - //{ - // avatar.ControllingClient.SendTeleportFailed("Problem with destination."); - // // We should close that agent we just created over at destination... - // List lst = new List(); - // lst.Add(reg.RegionHandle); - // SendCloseChildAgentAsync(avatar.UUID, lst); - // return; - //} - - SetInTransit(avatar.UUID); - // Let's send a full update of the agent. This is a synchronous call. - AgentData agent = new AgentData(); - avatar.CopyTo(agent); - agent.Position = position; - agent.CallbackURI = "http://" + m_regionInfo.ExternalHostName + ":" + m_regionInfo.HttpPort + - "/agent/" + avatar.UUID.ToString() + "/" + avatar.Scene.RegionInfo.RegionID.ToString() + "/release/"; - - m_scene.SimulationService.UpdateAgent(reg, agent); - - m_log.DebugFormat( - "[CAPS]: Sending new CAPS seed url {0} to client {1}", capsPath, avatar.UUID); - - - if (eq != null) - { - eq.TeleportFinishEvent(reg.RegionHandle, 13, endPoint, - 0, teleportFlags, capsPath, avatar.UUID); - } - else - { - avatar.ControllingClient.SendRegionTeleport(reg.RegionHandle, 13, endPoint, 4, - teleportFlags, capsPath); - } - - // TeleportFinish makes the client send CompleteMovementIntoRegion (at the destination), which - // trigers a whole shebang of things there, including MakeRoot. So let's wait for confirmation - // that the client contacted the destination before we send the attachments and close things here. - if (!WaitForCallback(avatar.UUID)) - { - // Client never contacted destination. Let's restore everything back - avatar.ControllingClient.SendTeleportFailed("Problems connecting to destination."); - - ResetFromTransit(avatar.UUID); - - // Yikes! We should just have a ref to scene here. - avatar.Scene.InformClientOfNeighbours(avatar); - - // Finally, kill the agent we just created at the destination. - m_scene.SimulationService.CloseAgent(reg, avatar.UUID); - - return; - } - - // Can't go back from here - if (KiPrimitive != null) - { - KiPrimitive(avatar.LocalId); - } - - avatar.MakeChildAgent(); - - // CrossAttachmentsIntoNewRegion is a synchronous call. We shouldn't need to wait after it - avatar.CrossAttachmentsIntoNewRegion(reg, true); - - // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone - - if (Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY)) - { - Thread.Sleep(5000); - avatar.Close(); - CloseConnection(avatar.UUID); - } - else - // now we have a child agent in this region. - avatar.Reset(); - - - // if (teleport success) // seems to be always success here - // the user may change their profile information in other region, - // so the userinfo in UserProfileCache is not reliable any more, delete it - - // REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE! - if (avatar.Scene.NeedSceneCacheClear(avatar.UUID)) - { - m_log.DebugFormat( - "[SCENE COMMUNICATION SERVICE]: User {0} is going to another region, profile cache removed", - avatar.UUID); - } - } - else - { - avatar.ControllingClient.SendTeleportFailed("Remote Region appears to be down"); - } - } - else - { - // TP to a place that doesn't exist (anymore) - // Inform the viewer about that - avatar.ControllingClient.SendTeleportFailed("The region you tried to teleport to doesn't exist anymore"); - - // and set the map-tile to '(Offline)' - uint regX, regY; - Utils.LongToUInts(regionHandle, out regX, out regY); - - MapBlockData block = new MapBlockData(); - block.X = (ushort)(regX / Constants.RegionSize); - block.Y = (ushort)(regY / Constants.RegionSize); - block.Access = 254; // == not there - - List blocks = new List(); - blocks.Add(block); - avatar.ControllingClient.SendMapBlock(blocks, 0); - } - } - } - - protected bool IsOutsideRegion(Scene s, Vector3 pos) - { - - if (s.TestBorderCross(pos,Cardinals.N)) - return true; - if (s.TestBorderCross(pos, Cardinals.S)) - return true; - if (s.TestBorderCross(pos, Cardinals.E)) - return true; - if (s.TestBorderCross(pos, Cardinals.W)) - return true; - - return false; - } - - public bool WaitForCallback(UUID id) - { - int count = 200; - while (m_agentsInTransit.Contains(id) && count-- > 0) - { - //m_log.Debug(" >>> Waiting... " + count); - Thread.Sleep(100); - } - - if (count > 0) - return true; - else - return false; - } - - public bool ReleaseAgent(UUID id) - { - //m_log.Debug(" >>> ReleaseAgent called <<< "); - return ResetFromTransit(id); - } - - public void SetInTransit(UUID id) - { - lock (m_agentsInTransit) - { - if (!m_agentsInTransit.Contains(id)) - m_agentsInTransit.Add(id); - } - } - - protected bool ResetFromTransit(UUID id) - { - lock (m_agentsInTransit) - { - if (m_agentsInTransit.Contains(id)) - { - m_agentsInTransit.Remove(id); - return true; - } - } - return false; - } - - private List NeighbourHandles(List neighbours) - { - List handles = new List(); - foreach (GridRegion reg in neighbours) - { - handles.Add(reg.RegionHandle); - } - return handles; - } - - private List NewNeighbours(List currentNeighbours, List previousNeighbours) - { - return currentNeighbours.FindAll(delegate(ulong handle) { return !previousNeighbours.Contains(handle); }); - } - -// private List CommonNeighbours(List currentNeighbours, List previousNeighbours) -// { -// return currentNeighbours.FindAll(delegate(ulong handle) { return previousNeighbours.Contains(handle); }); -// } - - private List OldNeighbours(List currentNeighbours, List previousNeighbours) - { - return previousNeighbours.FindAll(delegate(ulong handle) { return !currentNeighbours.Contains(handle); }); - } - - public void CrossAgentToNewRegion(Scene scene, ScenePresence agent, bool isFlying) - { - Vector3 pos = agent.AbsolutePosition; - Vector3 newpos = new Vector3(pos.X, pos.Y, pos.Z); - uint neighbourx = m_regionInfo.RegionLocX; - uint neighboury = m_regionInfo.RegionLocY; - const float boundaryDistance = 1.7f; - Vector3 northCross = new Vector3(0,boundaryDistance, 0); - Vector3 southCross = new Vector3(0, -1 * boundaryDistance, 0); - Vector3 eastCross = new Vector3(boundaryDistance, 0, 0); - Vector3 westCross = new Vector3(-1 * boundaryDistance, 0, 0); - - // distance to edge that will trigger crossing - - - // distance into new region to place avatar - const float enterDistance = 0.5f; - - if (scene.TestBorderCross(pos + westCross, Cardinals.W)) - { - if (scene.TestBorderCross(pos + northCross, Cardinals.N)) - { - Border b = scene.GetCrossedBorder(pos + northCross, Cardinals.N); - neighboury += (uint)(int)(b.BorderLine.Z / (int)Constants.RegionSize); - } - else if (scene.TestBorderCross(pos + southCross, Cardinals.S)) - { - Border b = scene.GetCrossedBorder(pos + southCross, Cardinals.S); - if (b.TriggerRegionX == 0 && b.TriggerRegionY == 0) - { - neighboury--; - newpos.Y = Constants.RegionSize - enterDistance; - } - else - { - neighboury = b.TriggerRegionY; - neighbourx = b.TriggerRegionX; - - Vector3 newposition = pos; - newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize; - newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize; - agent.ControllingClient.SendAgentAlertMessage( - String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false); - InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene); - return; - } - } - - Border ba = scene.GetCrossedBorder(pos + westCross, Cardinals.W); - if (ba.TriggerRegionX == 0 && ba.TriggerRegionY == 0) - { - neighbourx--; - newpos.X = Constants.RegionSize - enterDistance; - } - else - { - neighboury = ba.TriggerRegionY; - neighbourx = ba.TriggerRegionX; - - - Vector3 newposition = pos; - newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize; - newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize; - agent.ControllingClient.SendAgentAlertMessage( - String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false); - InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene); - - - return; - } - - } - else if (scene.TestBorderCross(pos + eastCross, Cardinals.E)) - { - Border b = scene.GetCrossedBorder(pos + eastCross, Cardinals.E); - neighbourx += (uint)(int)(b.BorderLine.Z / (int)Constants.RegionSize); - newpos.X = enterDistance; - - if (scene.TestBorderCross(pos + southCross, Cardinals.S)) - { - Border ba = scene.GetCrossedBorder(pos + southCross, Cardinals.S); - if (ba.TriggerRegionX == 0 && ba.TriggerRegionY == 0) - { - neighboury--; - newpos.Y = Constants.RegionSize - enterDistance; - } - else - { - neighboury = ba.TriggerRegionY; - neighbourx = ba.TriggerRegionX; - Vector3 newposition = pos; - newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize; - newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize; - agent.ControllingClient.SendAgentAlertMessage( - String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false); - InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene); - return; - } - } - else if (scene.TestBorderCross(pos + northCross, Cardinals.N)) - { - Border c = scene.GetCrossedBorder(pos + northCross, Cardinals.N); - neighboury += (uint)(int)(c.BorderLine.Z / (int)Constants.RegionSize); - newpos.Y = enterDistance; - } - - - } - else if (scene.TestBorderCross(pos + southCross, Cardinals.S)) - { - Border b = scene.GetCrossedBorder(pos + southCross, Cardinals.S); - if (b.TriggerRegionX == 0 && b.TriggerRegionY == 0) - { - neighboury--; - newpos.Y = Constants.RegionSize - enterDistance; - } - else - { - neighboury = b.TriggerRegionY; - neighbourx = b.TriggerRegionX; - Vector3 newposition = pos; - newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize; - newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize; - agent.ControllingClient.SendAgentAlertMessage( - String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false); - InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene); - return; - } - } - else if (scene.TestBorderCross(pos + northCross, Cardinals.N)) - { - - Border b = scene.GetCrossedBorder(pos + northCross, Cardinals.N); - neighboury += (uint)(int)(b.BorderLine.Z / (int)Constants.RegionSize); - newpos.Y = enterDistance; - } - - /* - - if (pos.X < boundaryDistance) //West - { - neighbourx--; - newpos.X = Constants.RegionSize - enterDistance; - } - else if (pos.X > Constants.RegionSize - boundaryDistance) // East - { - neighbourx++; - newpos.X = enterDistance; - } - - if (pos.Y < boundaryDistance) // South - { - neighboury--; - newpos.Y = Constants.RegionSize - enterDistance; - } - else if (pos.Y > Constants.RegionSize - boundaryDistance) // North - { - neighboury++; - newpos.Y = enterDistance; - } - */ - - CrossAgentToNewRegionDelegate d = CrossAgentToNewRegionAsync; - d.BeginInvoke(agent, newpos, neighbourx, neighboury, isFlying, CrossAgentToNewRegionCompleted, d); - } - - public delegate void InformClientToInitateTeleportToLocationDelegate(ScenePresence agent, uint regionX, uint regionY, - Vector3 position, - Scene initiatingScene); - - public void InformClientToInitateTeleportToLocation(ScenePresence agent, uint regionX, uint regionY, Vector3 position, - Scene initiatingScene) - { - - // This assumes that we know what our neighbors are. - - InformClientToInitateTeleportToLocationDelegate d = InformClientToInitiateTeleportToLocationAsync; - d.BeginInvoke(agent,regionX,regionY,position,initiatingScene, - InformClientToInitiateTeleportToLocationCompleted, - d); - } - - public void InformClientToInitiateTeleportToLocationAsync(ScenePresence agent, uint regionX, uint regionY, Vector3 position, - Scene initiatingScene) - { - Thread.Sleep(10000); - IMessageTransferModule im = initiatingScene.RequestModuleInterface(); - if (im != null) - { - UUID gotoLocation = Util.BuildFakeParcelID( - Util.UIntsToLong( - (regionX * - (uint)Constants.RegionSize), - (regionY * - (uint)Constants.RegionSize)), - (uint)(int)position.X, - (uint)(int)position.Y, - (uint)(int)position.Z); - GridInstantMessage m = new GridInstantMessage(initiatingScene, UUID.Zero, - "Region", agent.UUID, - (byte)InstantMessageDialog.GodLikeRequestTeleport, false, - "", gotoLocation, false, new Vector3(127, 0, 0), - new Byte[0]); - im.SendInstantMessage(m, delegate(bool success) - { - m_log.DebugFormat("[CLIENT]: Client Initiating Teleport sending IM success = {0}", success); - }); - - } - } - - private void InformClientToInitiateTeleportToLocationCompleted(IAsyncResult iar) - { - InformClientToInitateTeleportToLocationDelegate icon = - (InformClientToInitateTeleportToLocationDelegate) iar.AsyncState; - icon.EndInvoke(iar); - } - - public delegate ScenePresence CrossAgentToNewRegionDelegate(ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, bool isFlying); - - /// - /// This Closes child agents on neighboring regions - /// Calls an asynchronous method to do so.. so it doesn't lag the sim. - /// - protected ScenePresence CrossAgentToNewRegionAsync(ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, bool isFlying) - { - m_log.DebugFormat("[SCENE COMM]: Crossing agent {0} {1} to {2}-{3}", agent.Firstname, agent.Lastname, neighbourx, neighboury); - - ulong neighbourHandle = Utils.UIntsToLong((uint)(neighbourx * Constants.RegionSize), (uint)(neighboury * Constants.RegionSize)); - - int x = (int)(neighbourx * Constants.RegionSize), y = (int)(neighboury * Constants.RegionSize); - GridRegion neighbourRegion = m_scene.GridService.GetRegionByPosition(m_scene.RegionInfo.ScopeID, (int)x, (int)y); - - if (neighbourRegion != null && agent.ValidateAttachments()) - { - pos = pos + (agent.Velocity); - - //CachedUserInfo userInfo = m_commsProvider.UserProfileCacheService.GetUserDetails(agent.UUID); - //if (userInfo != null) - //{ - // userInfo.DropInventory(); - //} - //else - //{ - // m_log.WarnFormat("[SCENE COMM]: No cached user info found for {0} {1} on leaving region {2}", - // agent.Name, agent.UUID, agent.Scene.RegionInfo.RegionName); - //} - - //bool crossingSuccessful = - // CrossToNeighbouringRegion(neighbourHandle, agent.ControllingClient.AgentId, pos, - //isFlying); - - SetInTransit(agent.UUID); - AgentData cAgent = new AgentData(); - agent.CopyTo(cAgent); - cAgent.Position = pos; - if (isFlying) - cAgent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; - cAgent.CallbackURI = "http://" + m_regionInfo.ExternalHostName + ":" + m_regionInfo.HttpPort + - "/agent/" + agent.UUID.ToString() + "/" + agent.Scene.RegionInfo.RegionID.ToString() + "/release/"; - - m_scene.SimulationService.UpdateAgent(neighbourRegion, cAgent); - - // Next, let's close the child agent connections that are too far away. - agent.CloseChildAgents(neighbourx, neighboury); - - //AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo(); - agent.ControllingClient.RequestClientInfo(); - - //m_log.Debug("BEFORE CROSS"); - //Scene.DumpChildrenSeeds(UUID); - //DumpKnownRegions(); - string agentcaps; - if (!agent.KnownRegions.TryGetValue(neighbourRegion.RegionHandle, out agentcaps)) - { - m_log.ErrorFormat("[SCENE COMM]: No CAPS information for region handle {0}, exiting CrossToNewRegion.", - neighbourRegion.RegionHandle); - return agent; - } - // TODO Should construct this behind a method - string capsPath = - "http://" + neighbourRegion.ExternalHostName + ":" + neighbourRegion.HttpPort - + "/CAPS/" + agentcaps /*circuitdata.CapsPath*/ + "0000/"; - - m_log.DebugFormat("[CAPS]: Sending new CAPS seed url {0} to client {1}", capsPath, agent.UUID); - - IEventQueue eq = agent.Scene.RequestModuleInterface(); - if (eq != null) - { - eq.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint, - capsPath, agent.UUID, agent.ControllingClient.SessionId); - } - else - { - agent.ControllingClient.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint, - capsPath); - } - - if (!WaitForCallback(agent.UUID)) - { - ResetFromTransit(agent.UUID); - - // Yikes! We should just have a ref to scene here. - agent.Scene.InformClientOfNeighbours(agent); - - return agent; - } - - agent.MakeChildAgent(); - // now we have a child agent in this region. Request all interesting data about other (root) agents - agent.SendInitialFullUpdateToAllClients(); - - agent.CrossAttachmentsIntoNewRegion(neighbourRegion, true); - - // m_scene.SendKillObject(m_localId); - - agent.Scene.NotifyMyCoarseLocationChange(); - // the user may change their profile information in other region, - // so the userinfo in UserProfileCache is not reliable any more, delete it - // REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE! - if (agent.Scene.NeedSceneCacheClear(agent.UUID)) - { - m_log.DebugFormat( - "[SCENE COMM]: User {0} is going to another region", agent.UUID); - } - } - - //m_log.Debug("AFTER CROSS"); - //Scene.DumpChildrenSeeds(UUID); - //DumpKnownRegions(); - return agent; - } - - private void CrossAgentToNewRegionCompleted(IAsyncResult iar) - { - CrossAgentToNewRegionDelegate icon = (CrossAgentToNewRegionDelegate)iar.AsyncState; - ScenePresence agent = icon.EndInvoke(iar); - - // If the cross was successful, this agent is a child agent - if (agent.IsChildAgent) - { - agent.Reset(); - } - else // Not successful - { - //CachedUserInfo userInfo = m_commsProvider.UserProfileCacheService.GetUserDetails(agent.UUID); - //if (userInfo != null) - //{ - // userInfo.FetchInventory(); - //} - agent.RestoreInCurrentScene(); - } - // In any case - agent.NotInTransit(); - - //m_log.DebugFormat("[SCENE COMM]: Crossing agent {0} {1} completed.", agent.Firstname, agent.Lastname); - } public List RequestNamedRegions(string name, int maxNumber) { return m_scene.GridService.GetRegionsByName(UUID.Zero, name, maxNumber); } - private void Dump(string msg, List handles) - { - m_log.InfoFormat("-------------- HANDLE DUMP ({0}) ---------", msg); - foreach (ulong handle in handles) - { - uint x, y; - Utils.LongToUInts(handle, out x, out y); - x = x / Constants.RegionSize; - y = y / Constants.RegionSize; - m_log.InfoFormat("({0}, {1})", x, y); - } - } } } -- cgit v1.1 From d506449f6765ec7372615ffd4afefb0075d94af4 Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Tue, 23 Feb 2010 00:59:24 -0800 Subject: * Removed the unused GridRegion.getInternalEndPointPort() (just use InternalEndPoint.Port). This class is complex enough as it is * Changed the failed to inform neighbor message from a warning to info, since this will fire for every empty neighbor space * Made the EnableSimulator/EstablishAgentCommunication log message more verbose and more clear about what is happening --- OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs') diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index f1813a5..e87f7ca 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs @@ -173,7 +173,7 @@ namespace OpenSim.Region.Framework.Scenes } else { - m_log.WarnFormat("[INTERGRID]: Failed to inform neighbour {0}-{1} that I'm here.", x / Constants.RegionSize, y / Constants.RegionSize); + m_log.InfoFormat("[INTERGRID]: Failed to inform neighbour {0}-{1} that I'm here.", x / Constants.RegionSize, y / Constants.RegionSize); } } -- cgit v1.1