diff --git a/OpenSim/Framework/ChildAgentDataUpdate.cs b/OpenSim/Framework/ChildAgentDataUpdate.cs index 72c2c346d7..663d0ef6fc 100644 --- a/OpenSim/Framework/ChildAgentDataUpdate.cs +++ b/OpenSim/Framework/ChildAgentDataUpdate.cs @@ -353,6 +353,10 @@ namespace OpenSim.Framework public UUID PreyAgent; public Byte AgentAccess; public UUID ActiveGroupID; + public string ActiveGroupName; + public string ActiveGroupTitle = null; + public UUID agentCOF; + public bool isCrossingUpdate; public AgentGroupData[] Groups; public Dictionary ChildrenCapSeeds = null; @@ -374,12 +378,6 @@ namespace OpenSim.Framework MethodBase.GetCurrentMethod().DeclaringType); // DEBUG OFF -/* - public byte[] AgentTextures; - public byte[] VisualParams; - public UUID[] Wearables; - public AvatarAttachment[] Attachments; -*/ // Scripted public ControllerData[] Controllers; @@ -393,8 +391,6 @@ namespace OpenSim.Framework public virtual OSDMap Pack(EntityTransferContext ctx) { - int wearablesCount = -1; - // m_log.InfoFormat("[CHILDAGENTDATAUPDATE] Pack data"); OSDMap args = new OSDMap(); @@ -433,8 +429,14 @@ namespace OpenSim.Framework args["prey_agent"] = OSD.FromUUID(PreyAgent); args["agent_access"] = OSD.FromString(AgentAccess.ToString()); + args["agent_cof"] = OSD.FromUUID(agentCOF); + args["crossingupdate"] = OSD.FromBoolean(isCrossingUpdate); + args["active_group_id"] = OSD.FromUUID(ActiveGroupID); - + args["active_group_name"] = OSD.FromString(ActiveGroupName); + if(ActiveGroupTitle != null) + args["active_group_title"] = OSD.FromString(ActiveGroupTitle); + if ((Groups != null) && (Groups.Length > 0)) { OSDArray groups = new OSDArray(Groups.Length); @@ -497,48 +499,6 @@ namespace OpenSim.Framework if (Appearance != null) args["packed_appearance"] = Appearance.Pack(ctx); - //if ((AgentTextures != null) && (AgentTextures.Length > 0)) - //{ - // OSDArray textures = new OSDArray(AgentTextures.Length); - // foreach (UUID uuid in AgentTextures) - // textures.Add(OSD.FromUUID(uuid)); - // args["agent_textures"] = textures; - //} - - // The code to pack textures, visuals, wearables and attachments - // should be removed; packed appearance contains the full appearance - // This is retained for backward compatibility only - -/* then lets remove - if (Appearance.Texture != null) - { - byte[] rawtextures = Appearance.Texture.GetBytes(); - args["texture_entry"] = OSD.FromBinary(rawtextures); - } - - if ((Appearance.VisualParams != null) && (Appearance.VisualParams.Length > 0)) - args["visual_params"] = OSD.FromBinary(Appearance.VisualParams); - - // We might not pass this in all cases... - if ((Appearance.Wearables != null) && (Appearance.Wearables.Length > 0)) - { - OSDArray wears = new OSDArray(Appearance.Wearables.Length); - foreach (AvatarWearable awear in Appearance.Wearables) - wears.Add(awear.Pack()); - - args["wearables"] = wears; - } - - List attachments = Appearance.GetAttachments(); - if ((attachments != null) && (attachments.Count > 0)) - { - OSDArray attachs = new OSDArray(attachments.Count); - foreach (AvatarAttachment att in attachments) - attachs.Add(att.Pack()); - args["attachments"] = attachs; - } - // End of code to remove -*/ if ((Controllers != null) && (Controllers.Length > 0)) { OSDArray controls = new OSDArray(Controllers.Length); @@ -662,10 +622,22 @@ namespace OpenSim.Framework if (args["agent_access"] != null) Byte.TryParse(args["agent_access"].AsString(), out AgentAccess); - if (args["active_group_id"] != null) + if (args.ContainsKey("agent_cof") && args["agent_cof"] != null) + agentCOF = args["agent_cof"].AsUUID(); + + if (args.ContainsKey("crossingupdate") && args["crossingupdate"] != null) + isCrossingUpdate = args["crossingupdate"].AsBoolean(); + + if (args.ContainsKey("active_group_id") && args["active_group_id"] != null) ActiveGroupID = args["active_group_id"].AsUUID(); - if ((args["groups"] != null) && (args["groups"]).Type == OSDType.Array) + if (args.ContainsKey("active_group_name") && args["active_group_name"] != null) + ActiveGroupName = args["active_group_name"].AsString(); + + if(args.ContainsKey("active_group_title") && args["active_group_title"] != null) + ActiveGroupTitle = args["active_group_title"].AsString(); + + if (args.ContainsKey("groups") && (args["groups"] != null) && (args["groups"]).Type == OSDType.Array) { OSDArray groups = (OSDArray)(args["groups"]); Groups = new AgentGroupData[groups.Count]; diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 696d1dd6d8..a14fb25fbd 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -922,7 +922,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer // Let's send a full update of the agent. This is a synchronous call. AgentData agent = new AgentData(); - sp.CopyTo(agent); + sp.CopyTo(agent,false); if ((teleportFlags & (uint)TeleportFlags.IsFlying) != 0) agent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; @@ -1142,7 +1142,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer // Let's send a full update of the agent. AgentData agent = new AgentData(); - sp.CopyTo(agent); + sp.CopyTo(agent,false); agent.Position = agentCircuit.startpos; if ((teleportFlags & (uint)TeleportFlags.IsFlying) != 0) @@ -1701,7 +1701,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer try { AgentData cAgent = new AgentData(); - agent.CopyTo(cAgent); + agent.CopyTo(cAgent,true); // agent.Appearance.WearableCacheItems = null; @@ -2534,11 +2534,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (newRegionSizeY == 0) newRegionSizeY = Constants.RegionSize; - newpos.X = targetPosition.X - (neighbourRegion.RegionLocX - (int)scene.RegionInfo.WorldLocX); newpos.Y = targetPosition.Y - (neighbourRegion.RegionLocY - (int)scene.RegionInfo.WorldLocY); - const float enterDistance = 0.2f; newpos.X = Util.Clamp(newpos.X, enterDistance, newRegionSizeX - enterDistance); newpos.Y = Util.Clamp(newpos.Y, enterDistance, newRegionSizeY - enterDistance); @@ -2546,72 +2544,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return neighbourRegion; } -/* not in use. -> CrossPrimGroupIntoNewRegion - /// - /// Move the given scene object into a new region depending on which region its absolute position has moved - /// into. - /// - /// Using the objects new world location, ask the grid service for a the new region and adjust the prim - /// position to be relative to the new region. - /// - /// the scene object that we're crossing - /// the attempted out of region position of the scene object. This position is - /// relative to the region the object currently is in. - /// if 'true', the deletion of the client from the region is not broadcast to the clients - public void Cross(SceneObjectGroup grp, Vector3 attemptedPosition, bool silent) - { - if (grp == null) - return; - if (grp.IsDeleted) - return; - - Scene scene = grp.Scene; - if (scene == null) - return; - - // Remember the old group position in case the region lookup fails so position can be restored. - Vector3 oldGroupPosition = grp.RootPart.GroupPosition; - - // Compute the absolute position of the object. - double objectWorldLocX = (double)scene.RegionInfo.WorldLocX + attemptedPosition.X; - double objectWorldLocY = (double)scene.RegionInfo.WorldLocY + attemptedPosition.Y; - - // Ask the grid service for the region that contains the passed address - GridRegion destination = GetRegionContainingWorldLocation(scene.GridService, scene.RegionInfo.ScopeID, - objectWorldLocX, objectWorldLocY); - - Vector3 pos = Vector3.Zero; - if (destination != null) - { - // Adjust the object's relative position from the old region (attemptedPosition) - // to be relative to the new region (pos). - pos = new Vector3( (float)(objectWorldLocX - (double)destination.RegionLocX), - (float)(objectWorldLocY - (double)destination.RegionLocY), - attemptedPosition.Z); - } - - if (destination == null || !CrossPrimGroupIntoNewRegion(destination, pos, grp, silent)) - { - m_log.InfoFormat("[ENTITY TRANSFER MODULE] cross region transfer failed for object {0}", grp.UUID); - - // We are going to move the object back to the old position so long as the old position - // is in the region - oldGroupPosition.X = Util.Clamp(oldGroupPosition.X, 1.0f, (float)(scene.RegionInfo.RegionSizeX - 1)); - oldGroupPosition.Y = Util.Clamp(oldGroupPosition.Y, 1.0f, (float)(scene.RegionInfo.RegionSizeY - 1)); - oldGroupPosition.Z = Util.Clamp(oldGroupPosition.Z, 1.0f, Constants.RegionHeight); - - grp.AbsolutePosition = oldGroupPosition; - grp.Velocity = Vector3.Zero; - if (grp.RootPart.PhysActor != null) - grp.RootPart.PhysActor.CrossingFailure(); - - if (grp.RootPart.KeyframeMotion != null) - grp.RootPart.KeyframeMotion.CrossingFailure(); - - grp.ScheduleGroupForFullUpdate(); - } - } -*/ /// /// Move the given scene object into a new region /// diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 0ccdbf76de..c925719d44 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -346,7 +346,7 @@ namespace OpenSim.Region.Framework.Scenes private float m_healRate = 1f; private float m_healRatePerFrame = 0.05f; - protected ulong crossingFromRegion; +// protected ulong crossingFromRegion; private readonly Vector3[] Dir_Vectors = new Vector3[12]; @@ -568,19 +568,16 @@ namespace OpenSim.Region.Framework.Scenes public string Firstname { get; private set; } public string Lastname { get; private set; } + public bool haveGroupInformation; + public bool gotCrossUpdate; + public string Grouptitle { - get { return UseFakeGroupTitle ? "(Loading)" : m_groupTitle; } + get { return m_groupTitle; } set { m_groupTitle = value; } } private string m_groupTitle; - /// - /// When this is 'true', return a dummy group title instead of the real group title. This is - /// used as part of a hack to force viewers to update the displayed avatar name. - /// - public bool UseFakeGroupTitle { get; set; } - // Agent's Draw distance. private float m_drawDistance = 255f; public float DrawDistance @@ -1062,9 +1059,9 @@ namespace OpenSim.Region.Framework.Scenes if (account != null) UserLevel = account.UserLevel; - IGroupsModule gm = m_scene.RequestModuleInterface(); - if (gm != null) - Grouptitle = gm.GetGroupTitle(m_uuid); + // IGroupsModule gm = m_scene.RequestModuleInterface(); + // if (gm != null) + // Grouptitle = gm.GetGroupTitle(m_uuid); m_scriptEngines = m_scene.RequestModuleInterfaces(); @@ -1258,11 +1255,6 @@ namespace OpenSim.Region.Framework.Scenes // Should not be needed if we are not trying to tell this region to close // DoNotCloseAfterTeleport = false; - IGroupsModule gm = m_scene.RequestModuleInterface(); - if (gm != null) - Grouptitle = gm.GetGroupTitle(m_uuid); - - m_log.DebugFormat("[MakeRootAgent] Grouptitle: {0}ms", Util.EnvironmentTickCountSubtract(ts)); RegionHandle = m_scene.RegionInfo.RegionHandle; @@ -1511,6 +1503,8 @@ namespace OpenSim.Region.Framework.Scenes /// public void MakeChildAgent(ulong newRegionHandle) { + haveGroupInformation = false; + gotCrossUpdate = false; m_scene.EventManager.OnRegionHeartbeatEnd -= RegionHeartbeatEnd; RegionHandle = newRegionHandle; @@ -1978,25 +1972,29 @@ namespace OpenSim.Region.Framework.Scenes m_log.DebugFormat("[CompleteMovement] MakeRootAgent: {0}ms", Util.EnvironmentTickCountSubtract(ts)); - -// start sending terrain patchs - if (!isNPC) - Scene.SendLayerData(ControllingClient); - - if (!IsChildAgent && !isNPC) + if(!haveGroupInformation && !IsChildAgent && !isNPC) { + // oh crap.. lets retry it directly + IGroupsModule gm = m_scene.RequestModuleInterface(); + if (gm != null) + Grouptitle = gm.GetGroupTitle(m_uuid); + + m_log.DebugFormat("[CompleteMovement] Missing Grouptitle: {0}ms", Util.EnvironmentTickCountSubtract(ts)); + InventoryFolderBase cof = m_scene.InventoryService.GetFolderForType(client.AgentId, (FolderType)46); if (cof == null) COF = UUID.Zero; else COF = cof.ID; - m_log.DebugFormat("[ScenePresence]: CompleteMovement COF for {0} is {1}", client.AgentId, COF); + m_log.DebugFormat("[CompleteMovement]: Missing COF for {0} is {1}", client.AgentId, COF); } + // Tell the client that we're totally ready ControllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look); + m_log.DebugFormat("[CompleteMovement] MoveAgentIntoRegion: {0}ms", Util.EnvironmentTickCountSubtract(ts)); if (!string.IsNullOrEmpty(m_callbackURI)) @@ -2029,6 +2027,10 @@ namespace OpenSim.Region.Framework.Scenes m_log.DebugFormat("[CompleteMovement] ReleaseAgent: {0}ms", Util.EnvironmentTickCountSubtract(ts)); +// start sending terrain patchs + if (!gotCrossUpdate && !isNPC) + Scene.SendLayerData(ControllingClient); + m_previusParcelHide = false; m_previusParcelUUID = UUID.Zero; m_currentParcelHide = false; @@ -2204,6 +2206,9 @@ namespace OpenSim.Region.Framework.Scenes // m_currentParcelHide = newhide; // } + haveGroupInformation = true; + gotCrossUpdate = false; + m_scene.EventManager.OnRegionHeartbeatEnd += RegionHeartbeatEnd; m_log.DebugFormat("[CompleteMovement] end: {0}ms", Util.EnvironmentTickCountSubtract(ts)); @@ -4470,7 +4475,7 @@ namespace OpenSim.Region.Framework.Scenes checkRePrioritization(); } - public void CopyTo(AgentData cAgent) + public void CopyTo(AgentData cAgent, bool isCrossUpdate) { cAgent.CallbackURI = m_callbackURI; @@ -4534,6 +4539,29 @@ namespace OpenSim.Region.Framework.Scenes if (Scene.AttachmentsModule != null) Scene.AttachmentsModule.CopyAttachments(this, cAgent); + + cAgent.isCrossingUpdate = isCrossUpdate; + + if(isCrossUpdate && haveGroupInformation) + { + + cAgent.agentCOF = COF; + cAgent.ActiveGroupID = ControllingClient.ActiveGroupId; + cAgent.ActiveGroupName = ControllingClient.ActiveGroupName; + cAgent.ActiveGroupTitle = Grouptitle; + Dictionary gpowers = ControllingClient.GetGroupPowers(); + if(gpowers.Count >0) + { + cAgent.Groups = new AgentGroupData[gpowers.Count]; + int i = 0; + foreach (UUID gid in gpowers.Keys) + { + // WARNING we dont' have AcceptNotices in cache.. sending as true mb no one notices ;) + AgentGroupData agd = new AgentGroupData(gid,gpowers[gid],true); + cAgent.Groups[i++] = agd; + } + } + } } private void CopyFrom(AgentData cAgent) @@ -4629,6 +4657,45 @@ namespace OpenSim.Region.Framework.Scenes if (Scene.AttachmentsModule != null) Scene.AttachmentsModule.CopyAttachments(cAgent, this); + haveGroupInformation = false; + + // using this as protocol detection don't want to mess with the numbers for now + if(cAgent.ActiveGroupTitle != null) + { + COF = cAgent.agentCOF; + ControllingClient.ActiveGroupId = cAgent.ActiveGroupID; + ControllingClient.ActiveGroupName = cAgent.ActiveGroupName; + ControllingClient.ActiveGroupPowers = 0; + Grouptitle = cAgent.ActiveGroupTitle; + int ngroups = cAgent.Groups.Length; + if(ngroups > 0) + { + Dictionary gpowers = new Dictionary(ngroups); + for(int i = 0 ; i < ngroups; i++) + { + AgentGroupData agd = cAgent.Groups[i]; + gpowers[agd.GroupID] = agd.GroupPowers; + } + + ControllingClient.SetGroupPowers(gpowers); + + if(cAgent.ActiveGroupID == UUID.Zero) + haveGroupInformation = true; + else if(gpowers.ContainsKey(cAgent.ActiveGroupID)) + { + ControllingClient.ActiveGroupPowers = gpowers[cAgent.ActiveGroupID]; + haveGroupInformation = true; + } + } + else if(cAgent.ActiveGroupID == UUID.Zero) + { + haveGroupInformation = true; + } + } + + gotCrossUpdate = cAgent.isCrossingUpdate; + + lock (m_originRegionIDAccessLock) m_originRegionID = cAgent.RegionID; } @@ -4636,7 +4703,7 @@ namespace OpenSim.Region.Framework.Scenes public bool CopyAgent(out IAgentData agent) { agent = new CompleteAgentData(); - CopyTo((AgentData)agent); + CopyTo((AgentData)agent, false); return true; } diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs index ddeac6689a..5205eae72c 100644 --- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs @@ -278,7 +278,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups // There might be some problem with the thread we're generating this on but not // doing the update at this time causes problems (Mantis #7920 and #7915) // TODO: move sending this update to a later time in the rootification of the client. - SendAgentGroupDataUpdate(sp.ControllingClient, false); + if(!sp.haveGroupInformation) + SendAgentGroupDataUpdate(sp.ControllingClient, false); } private void OnMakeChild(ScenePresence sp)