diff --git a/OpenSim/Framework/AvatarAppearance.cs b/OpenSim/Framework/AvatarAppearance.cs index ddcd0b1b62..26dd5dfe0c 100644 --- a/OpenSim/Framework/AvatarAppearance.cs +++ b/OpenSim/Framework/AvatarAppearance.cs @@ -69,6 +69,8 @@ namespace OpenSim.Framework protected WearableCacheItem[] m_cacheitems; protected bool m_cacheItemsDirty = true; + + public bool PackLegacyWearables {get; set; } public virtual int Serial { get { return m_serial; } @@ -133,7 +135,7 @@ namespace OpenSim.Framework public AvatarAppearance() { // m_log.WarnFormat("[AVATAR APPEARANCE]: create empty appearance"); - + PackLegacyWearables = false; m_serial = 0; SetDefaultWearables(); SetDefaultTexture(); @@ -712,8 +714,15 @@ namespace OpenSim.Framework data["height"] = OSD.FromReal(m_avatarHeight); // Wearables - OSDArray wears = new OSDArray(AvatarWearable.MAX_WEARABLES); - for (int i = 0; i < AvatarWearable.MAX_WEARABLES; i++) + + int wearsCount; + if(PackLegacyWearables) + wearsCount = AvatarWearable.LEGACY_VERSION_MAX_WEARABLES; + else + wearsCount = AvatarWearable.MAX_WEARABLES; + + OSDArray wears = new OSDArray(wearsCount); + for (int i = 0; i < wearsCount; i++) wears.Add(m_wearables[i].Pack()); data["wearables"] = wears; diff --git a/OpenSim/Framework/AvatarWearable.cs b/OpenSim/Framework/AvatarWearable.cs index 8e27596b85..e7615f2b42 100644 --- a/OpenSim/Framework/AvatarWearable.cs +++ b/OpenSim/Framework/AvatarWearable.cs @@ -65,7 +65,9 @@ namespace OpenSim.Framework public static readonly int ALPHA = 13; public static readonly int TATTOO = 14; - public static readonly int MAX_WEARABLES = 15; + public static readonly int LEGACY_VERSION_MAX_WEARABLES = 15; + public static readonly int PHYSICS = 15; + public static readonly int MAX_WEARABLES = 16; public static readonly UUID DEFAULT_BODY_ITEM = new UUID("66c41e39-38f9-f75a-024e-585989bfaba9"); public static readonly UUID DEFAULT_BODY_ASSET = new UUID("66c41e39-38f9-f75a-024e-585989bfab73"); diff --git a/OpenSim/Framework/ChildAgentDataUpdate.cs b/OpenSim/Framework/ChildAgentDataUpdate.cs index 3d8f7bd055..1504f21aa1 100644 --- a/OpenSim/Framework/ChildAgentDataUpdate.cs +++ b/OpenSim/Framework/ChildAgentDataUpdate.cs @@ -443,9 +443,18 @@ namespace OpenSim.Framework // 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()); + int wearsCount; + if(Appearance.PackLegacyWearables) + wearsCount = AvatarWearable.LEGACY_VERSION_MAX_WEARABLES; + else + wearsCount = AvatarWearable.MAX_WEARABLES; + + if(wearsCount > Appearance.Wearables.Length) + wearsCount = Appearance.Wearables.Length; + + OSDArray wears = new OSDArray(wearsCount); + for(int i = 0; i < wearsCount ; i++) + wears.Add(Appearance.Wearables[i].Pack()); args["wearables"] = wears; } diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index e4bc1135c2..a2417c4d54 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -768,7 +768,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer AgentCircuitData agentCircuit = sp.ControllingClient.RequestClientInfo(); agentCircuit.startpos = position; agentCircuit.child = true; - agentCircuit.Appearance = sp.Appearance; + agentCircuit.Appearance = new AvatarAppearance(); + agentCircuit.Appearance.PackLegacyWearables = true; if (currentAgentCircuit != null) { agentCircuit.ServiceURLs = currentAgentCircuit.ServiceURLs; @@ -805,7 +806,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer "[ENTITY TRANSFER MODULE]: Using TP V1 for {0} going from {1} to {2}", sp.Name, Scene.Name, finalDestination.RegionName); - // Let's create an agent there if one doesn't exist yet. + // Let's create an agent there if one doesn't exist yet. // NOTE: logout will always be false for a non-HG teleport. bool logout = false; if (!CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout)) @@ -906,6 +907,8 @@ 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); + if (ctx.OutboundVersion < 0.5f) + agent.Appearance.PackLegacyWearables = true; agent.Position = agentCircuit.startpos; SetCallbackURL(agent, sp.Scene.RegionInfo); @@ -1145,6 +1148,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer // Let's send a full update of the agent. AgentData agent = new AgentData(); sp.CopyTo(agent); + if (ctx.OutboundVersion < 0.5f) + agent.Appearance.PackLegacyWearables = true; agent.Position = agentCircuit.startpos; agent.SenderWantsToWaitForRoot = true; //SetCallbackURL(agent, sp.Scene.RegionInfo); @@ -1628,7 +1633,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer m_entityTransferStateMachine.ResetFromTransit(agent.UUID); } - if (!CrossAgentIntoNewRegionMain(agent, pos, neighbourRegion, isFlying)) + if (!CrossAgentIntoNewRegionMain(agent, pos, neighbourRegion, isFlying, ctx)) { m_log.DebugFormat("{0}: CrossAgentToNewRegionAsync: cross main failed. Resetting transfer state", LogHeader); m_entityTransferStateMachine.ResetFromTransit(agent.UUID); @@ -1644,12 +1649,14 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return agent; } - public bool CrossAgentIntoNewRegionMain(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, bool isFlying) + public bool CrossAgentIntoNewRegionMain(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, bool isFlying, EntityTransferContext ctx) { try { AgentData cAgent = new AgentData(); agent.CopyTo(cAgent); + if (ctx.OutboundVersion < 0.5f) + cAgent.Appearance.PackLegacyWearables = true; cAgent.Position = pos; if (isFlying) @@ -1815,7 +1822,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer agent.InventoryFolder = UUID.Zero; agent.startpos = new Vector3(128, 128, 70); agent.child = true; - agent.Appearance = sp.Appearance; + agent.Appearance = new AvatarAppearance(); + agent.Appearance.PackLegacyWearables = true; agent.CapsPath = CapsUtil.GetRandomCapsObjectPath(); agent.ChildrenCapSeeds = new Dictionary(sp.Scene.CapsModule.GetChildrenSeeds(sp.UUID)); @@ -1938,7 +1946,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer agent.InventoryFolder = UUID.Zero; agent.startpos = sp.AbsolutePosition + CalculateOffset(sp, neighbour); agent.child = true; - agent.Appearance = sp.Appearance; + agent.Appearance = new AvatarAppearance(); + agent.Appearance.PackLegacyWearables = true; if (currentAgentCircuit != null) { agent.ServiceURLs = currentAgentCircuit.ServiceURLs;