From 5de40aaf46bc956fb6c25b36fb01b5a1cde2d30d Mon Sep 17 00:00:00 2001 From: diva Date: Wed, 31 Dec 2008 00:18:24 +0000 Subject: Added a SendChildAgentDataUpdate call on Teleports, so that the agent at the destination will have all the necessary information. --- .../Hypergrid/HGSceneCommunicationService.cs | 53 ++++++++++--------- .../Scenes/SceneCommunicationService.cs | 40 +++++++++------ OpenSim/Region/Environment/Scenes/ScenePresence.cs | 59 ++++++++++++++++++++-- 3 files changed, 110 insertions(+), 42 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/Environment/Scenes/Hypergrid/HGSceneCommunicationService.cs b/OpenSim/Region/Environment/Scenes/Hypergrid/HGSceneCommunicationService.cs index 363a93f..bcd378f 100644 --- a/OpenSim/Region/Environment/Scenes/Hypergrid/HGSceneCommunicationService.cs +++ b/OpenSim/Region/Environment/Scenes/Hypergrid/HGSceneCommunicationService.cs @@ -180,40 +180,40 @@ namespace OpenSim.Region.Environment.Scenes.Hypergrid // once we reach here... //avatar.Scene.RemoveCapsHandler(avatar.UUID); - // Let's close some agents - if (isHyperLink) // close them all except this one - { - List regions = new List(avatar.KnownChildRegionHandles); - regions.Remove(avatar.Scene.RegionInfo.RegionHandle); - SendCloseChildAgentConnections(avatar.UUID, regions); - } - else // close just a few - avatar.CloseChildAgents(newRegionX, newRegionY); - string capsPath = String.Empty; - AgentCircuitData agent = avatar.ControllingClient.RequestClientInfo(); - agent.BaseFolder = UUID.Zero; - agent.InventoryFolder = UUID.Zero; - agent.startpos = position; - agent.child = true; + AgentCircuitData agentCircuit = avatar.ControllingClient.RequestClientInfo(); + agentCircuit.BaseFolder = UUID.Zero; + agentCircuit.InventoryFolder = UUID.Zero; + agentCircuit.startpos = position; + agentCircuit.child = true; if (Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY)) { // brand new agent, let's create a new caps seed - agent.CapsPath = Util.GetRandomCapsPath(); + agentCircuit.CapsPath = Util.GetRandomCapsPath(); } - if (!m_commsProvider.InterRegion.InformRegionOfChildAgent(reg.RegionHandle, agent)) + if (!m_commsProvider.InterRegion.InformRegionOfChildAgent(reg.RegionHandle, agentCircuit)) { avatar.ControllingClient.SendTeleportFailed("Destination is not accepting teleports."); return; } + // Let's close some agents + if (isHyperLink) // close them all except this one + { + List regions = new List(avatar.KnownChildRegionHandles); + regions.Remove(avatar.Scene.RegionInfo.RegionHandle); + SendCloseChildAgentConnections(avatar.UUID, regions); + } + else // close just a few + avatar.CloseChildAgents(newRegionX, newRegionY); + if (Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY) || isHyperLink) { // TODO Should construct this behind a method capsPath = "http://" + reg.ExternalHostName + ":" + reg.HttpPort - + "/CAPS/" + agent.CapsPath + "0000/"; + + "/CAPS/" + agentCircuit.CapsPath + "0000/"; if (eq != null) { @@ -237,9 +237,9 @@ namespace OpenSim.Region.Environment.Scenes.Hypergrid else { // child agent already there - agent.CapsPath = avatar.Scene.GetChildSeed(avatar.UUID, reg.RegionHandle); + agentCircuit.CapsPath = avatar.Scene.GetChildSeed(avatar.UUID, reg.RegionHandle); capsPath = "http://" + reg.ExternalHostName + ":" + reg.HttpPort - + "/CAPS/" + agent.CapsPath + "0000/"; + + "/CAPS/" + agentCircuit.CapsPath + "0000/"; } //m_commsProvider.InterRegion.ExpectAvatarCrossing(reg.RegionHandle, avatar.ControllingClient.AgentId, @@ -256,10 +256,17 @@ namespace OpenSim.Region.Environment.Scenes.Hypergrid // return; //} + // Let's send a full update of the agent. This is a synchronous call. + AgentData agent = new AgentData(); + avatar.CopyTo(agent); + agent.Position = new Vector3(-1, -1, -1); // this means ignore position info; UGH!!!! + + m_interregionCommsOut.SendChildAgentUpdate(reg.RegionHandle, agent); + avatar.MakeChildAgent(); m_log.DebugFormat( - "[CAPS]: Sending new CAPS seed url {0} to client {1}", agent.CapsPath, avatar.UUID); + "[CAPS]: Sending new CAPS seed url {0} to client {1}", agentCircuit.CapsPath, avatar.UUID); /// @@ -291,7 +298,7 @@ namespace OpenSim.Region.Environment.Scenes.Hypergrid // we send the attachments and close things here. // It would be nice if the client would tell us when that whole thing is done, so we wouldn't have // to use this Thread.Sleep voodoo - Thread.Sleep(3000); + Thread.Sleep(4000); // CrossAttachmentsIntoNewRegion is a synchronous call. We shouldn't need to wait after it avatar.CrossAttachmentsIntoNewRegion(reg.RegionHandle, true); @@ -303,7 +310,7 @@ namespace OpenSim.Region.Environment.Scenes.Hypergrid /// if (Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY) || isHyperLink) { - Thread.Sleep(5000); + Thread.Sleep(8000); avatar.Close(); CloseConnection(avatar.UUID); } diff --git a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs index 7385725..2bf81d8 100644 --- a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs @@ -791,33 +791,34 @@ namespace OpenSim.Region.Environment.Scenes //avatar.Scene.RemoveCapsHandler(avatar.UUID); - // Let's close some agents - avatar.CloseChildAgents(newRegionX, newRegionY); - string capsPath = String.Empty; - AgentCircuitData agent = avatar.ControllingClient.RequestClientInfo(); - agent.BaseFolder = UUID.Zero; - agent.InventoryFolder = UUID.Zero; - agent.startpos = position; - agent.child = true; + AgentCircuitData agentCircuit = avatar.ControllingClient.RequestClientInfo(); + agentCircuit.BaseFolder = UUID.Zero; + agentCircuit.InventoryFolder = UUID.Zero; + agentCircuit.startpos = position; + agentCircuit.child = true; if (Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY)) { // brand new agent, let's create a new caps seed - agent.CapsPath = Util.GetRandomCapsPath(); + agentCircuit.CapsPath = Util.GetRandomCapsPath(); } - if (!m_commsProvider.InterRegion.InformRegionOfChildAgent(reg.RegionHandle, agent)) + // Let's create an agent there if one doesn't exist yet. + if (!m_commsProvider.InterRegion.InformRegionOfChildAgent(reg.RegionHandle, agentCircuit)) { avatar.ControllingClient.SendTeleportFailed("Destination is not accepting teleports."); return; } + // OK, it got this agent. Let's close some child agents + avatar.CloseChildAgents(newRegionX, newRegionY); + if (Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY)) { // TODO Should construct this behind a method capsPath = "http://" + reg.ExternalHostName + ":" + reg.HttpPort - + "/CAPS/" + agent.CapsPath + "0000/"; + + "/CAPS/" + agentCircuit.CapsPath + "0000/"; if (eq != null) { @@ -839,9 +840,9 @@ namespace OpenSim.Region.Environment.Scenes } else { - agent.CapsPath = avatar.Scene.GetChildSeed(avatar.UUID, reg.RegionHandle); + agentCircuit.CapsPath = avatar.Scene.GetChildSeed(avatar.UUID, reg.RegionHandle); capsPath = "http://" + reg.ExternalHostName + ":" + reg.HttpPort - + "/CAPS/" + agent.CapsPath + "0000/"; + + "/CAPS/" + agentCircuit.CapsPath + "0000/"; } // Expect avatar crossing is a heavy-duty function at the destination. @@ -859,6 +860,13 @@ namespace OpenSim.Region.Environment.Scenes // return; //} + // Let's send a full update of the agent. This is a synchronous call. + AgentData agent = new AgentData(); + avatar.CopyTo(agent); + agent.Position = new Vector3(-1, -1, -1); // this means ignore position info; UGH!!!! + + m_interregionCommsOut.SendChildAgentUpdate(reg.RegionHandle, agent); + avatar.MakeChildAgent(); m_log.DebugFormat( @@ -885,7 +893,9 @@ namespace OpenSim.Region.Environment.Scenes // TeleportFinish makes the client send CompleteMovementIntoRegion (at the destination), which // trigers a whole shebang of things there, including MakeRoot. So let's wait plenty before // we send the attachments and close things here. - Thread.Sleep(3000); + // We need to change this part of the protocol. The receiving region should tell this region + // when it's ok to continue. + Thread.Sleep(4000); // CrossAttachmentsIntoNewRegion is a synchronous call. We shouldn't need to wait after it avatar.CrossAttachmentsIntoNewRegion(reg.RegionHandle, true); @@ -894,7 +904,7 @@ namespace OpenSim.Region.Environment.Scenes if (Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY)) { - Thread.Sleep(5000); + Thread.Sleep(8000); avatar.Close(); CloseConnection(avatar.UUID); } diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs index 41971fc..23dc9be 100644 --- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs @@ -2571,6 +2571,7 @@ namespace OpenSim.Region.Environment.Scenes ControllingClient.SendAdminResponse(token, (uint)m_godlevel); } + #region Child Agent Updates /// /// This updates important decision making data about a child agent /// The main purpose is to figure out what objects to send to a child agent that's in a neighboring region @@ -2581,22 +2582,34 @@ namespace OpenSim.Region.Environment.Scenes if (!IsChildAgent) return; + //Console.WriteLine(" >>> ChildAgentDataUpdate <<<"); int shiftx = ((int)rRegionX - (int)tRegionX) * (int)Constants.RegionSize; int shifty = ((int)rRegionY - (int)tRegionY) * (int)Constants.RegionSize; m_DrawDistance = cAgentData.Far; - m_pos = new Vector3(cAgentData.Position.X + shiftx, cAgentData.Position.Y + shifty, cAgentData.Position.Z); + if (cAgentData.Position != new Vector3(-1, -1, -1)) // UGH!! + m_pos = new Vector3(cAgentData.Position.X + shiftx, cAgentData.Position.Y + shifty, cAgentData.Position.Z); // It's hard to say here.. We can't really tell where the camera position is unless it's in world cordinates from the sending region - m_CameraCenter = cAgentData.Center; + if (cAgentData.Center!= new Vector3(-1, -1, -1)) // UGH! + m_CameraCenter = cAgentData.Center; // new Vector3(cAgentData.cameraPosition.x, cAgentData.cameraPosition.y, cAgentData.cameraPosition.z); m_godlevel = cAgentData.GodLevel; - m_avHeight = cAgentData.Size.Z; + if (cAgentData.Center != new Vector3(-1, -1, -1)) + m_avHeight = cAgentData.Size.Z; //SetHeight(cAgentData.AVHeight); - ControllingClient.SetChildAgentThrottle(cAgentData.Throttles); + if ((cAgentData.Throttles != null) && cAgentData.Throttles.Length > 0) + ControllingClient.SetChildAgentThrottle(cAgentData.Throttles); + + // ugh!!! + m_AgentControlFlags = cAgentData.ControlFlags; + if (m_physicsActor != null) + { + m_physicsActor.Flying = ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0); + } // Sends out the objects in the user's draw distance if m_sendTasksToChild is true. if (m_scene.m_seeIntoRegionFromNeighbor) @@ -2607,6 +2620,44 @@ namespace OpenSim.Region.Environment.Scenes //m_velocity = cAgentData.Velocity; } + public void CopyTo(AgentData cAgent) + { + cAgent.AgentID = UUID; + cAgent.RegionHandle = m_scene.RegionInfo.RegionHandle; + cAgent.AlwaysRun = m_setAlwaysRun; + cAgent.Size = new Vector3(0, 0, m_avHeight); + cAgent.Center = m_CameraCenter; + cAgent.Far = m_DrawDistance; + cAgent.GodLevel = (byte)m_godlevel; + cAgent.Position = AbsolutePosition; + cAgent.Velocity = Velocity; + // Throttles + float multiplier = 1; + int innacurateNeighbors = m_scene.GetInaccurateNeighborCount(); + if (innacurateNeighbors != 0) + { + multiplier = 1f / (float)innacurateNeighbors; + } + if (multiplier <= 0f) + { + multiplier = 0.25f; + } + //m_log.Info("[NeighborThrottle]: " + m_scene.GetInaccurateNeighborCount().ToString() + " - m: " + multiplier.ToString()); + cAgent.Throttles = ControllingClient.GetThrottlesPacked(multiplier); + + if ((m_physicsActor != null) && (m_physicsActor.Flying)) + { + m_AgentControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; + } + cAgent.ControlFlags = m_AgentControlFlags; + + // Groups??? + // Visual Params??? + // Animations??? + } + + #endregion Child Agent Updates + /// /// Handles part of the PID controller function for moving an avatar. /// -- cgit v1.1