From 69585a4824a7814bbe543d624de6c3627e0b927b Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Sun, 1 Nov 2015 19:11:14 +0100 Subject: More plumbing of the EntityTransferContext (not yet complete) --- OpenSim/Framework/AgentCircuitData.cs | 4 +- OpenSim/Framework/AvatarAppearance.cs | 50 ++++++++++++++++--------- OpenSim/Framework/AvatarWearable.cs | 7 ++-- OpenSim/Framework/ChildAgentDataUpdate.cs | 28 ++++++++------ OpenSim/Framework/Tests/AgentCircuitDataTest.cs | 2 +- 5 files changed, 57 insertions(+), 34 deletions(-) (limited to 'OpenSim/Framework') diff --git a/OpenSim/Framework/AgentCircuitData.cs b/OpenSim/Framework/AgentCircuitData.cs index 0d053e4..f4b35a6 100644 --- a/OpenSim/Framework/AgentCircuitData.cs +++ b/OpenSim/Framework/AgentCircuitData.cs @@ -184,7 +184,7 @@ namespace OpenSim.Framework /// Pack AgentCircuitData into an OSDMap for transmission over LLSD XML or LLSD json /// /// map of the agent circuit data - public OSDMap PackAgentCircuitData() + public OSDMap PackAgentCircuitData(int wearablesCount) { OSDMap args = new OSDMap(); args["agent_id"] = OSD.FromUUID(AgentID); @@ -224,7 +224,7 @@ namespace OpenSim.Framework { args["appearance_serial"] = OSD.FromInteger(Appearance.Serial); - OSDMap appmap = Appearance.Pack(); + OSDMap appmap = Appearance.Pack(wearablesCount); args["packed_appearance"] = appmap; } diff --git a/OpenSim/Framework/AvatarAppearance.cs b/OpenSim/Framework/AvatarAppearance.cs index 72c6bfc..50746a0 100644 --- a/OpenSim/Framework/AvatarAppearance.cs +++ b/OpenSim/Framework/AvatarAppearance.cs @@ -211,13 +211,12 @@ namespace OpenSim.Framework m_serial = appearance.Serial; - m_wearables = new AvatarWearable[AvatarWearable.MAX_WEARABLES]; - for (int i = 0; i < AvatarWearable.MAX_WEARABLES; i++) - m_wearables[i] = new AvatarWearable(); + ClearWearables(); if (copyWearables && (appearance.Wearables != null)) { - for (int i = 0; i < AvatarWearable.MAX_WEARABLES; i++) + m_wearables = new AvatarWearable[appearance.Wearables.Length]; + for (int i = 0; i < appearance.Wearables.Length; i++) SetWearable(i,appearance.Wearables[i]); } @@ -247,7 +246,7 @@ namespace OpenSim.Framework public void GetAssetsFrom(AvatarAppearance app) { - for (int i = 0; i < AvatarWearable.MAX_WEARABLES; i++) + for (int i = 0; i < m_wearables.Length; i++) { for (int j = 0; j < m_wearables[i].Count; j++) { @@ -262,8 +261,8 @@ namespace OpenSim.Framework public void ClearWearables() { - m_wearables = new AvatarWearable[AvatarWearable.MAX_WEARABLES]; - for (int i = 0; i < AvatarWearable.MAX_WEARABLES; i++) + m_wearables = new AvatarWearable[AvatarWearable.LEGACY_VERSION_MAX_WEARABLES]; + for (int i = 0; i < AvatarWearable.LEGACY_VERSION_MAX_WEARABLES; i++) m_wearables[i] = new AvatarWearable(); } @@ -470,11 +469,15 @@ namespace OpenSim.Framework // DEBUG ON // m_log.WarnFormat("[AVATARAPPEARANCE] set wearable {0} --> {1}:{2}",wearableId,wearable.ItemID,wearable.AssetID); // DEBUG OFF + if (wearableId >= m_wearables.Length) + { + int currentLength = m_wearables.Length; + Array.Resize(ref m_wearables, wearableId + 1); + for (int i = currentLength ; i < m_wearables.Length ; i++) + m_wearables[i] = new AvatarWearable(); + } m_wearables[wearableId].Clear(); - int count = wearable.Count; - if (count > AvatarWearable.MAX_WEARABLES) - count = AvatarWearable.MAX_WEARABLES; - for (int i = 0; i < count; i++) + for (int i = 0; i < wearable.Count; i++) m_wearables[wearableId].Add(wearable[i].ItemID, wearable[i].AssetID); } @@ -714,7 +717,7 @@ namespace OpenSim.Framework /// /// Create an OSDMap from the appearance data /// - public OSDMap Pack() + public OSDMap Pack(int wearablesCount) { OSDMap data = new OSDMap(); @@ -722,9 +725,22 @@ 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++) - wears.Add(m_wearables[i].Pack()); + // + // This will send as many or as few wearables as we have, unless a count + // is given. Used for legacy (pre 0.4) versions. + int count = wearablesCount; + if (wearablesCount == -1) + count = m_wearables.Length; + OSDArray wears = new OSDArray(count); + for (int i = 0; i < count; i++) + { + AvatarWearable dummyWearable = new AvatarWearable(); + + if (i < m_wearables.Length) + wears.Add(m_wearables[i].Pack()); + else + wears.Add(dummyWearable.Pack()); + } data["wearables"] = wears; // Avatar Textures @@ -782,8 +798,8 @@ namespace OpenSim.Framework OSDArray wears = (OSDArray)(data["wearables"]); int count = wears.Count; - if (count > AvatarWearable.MAX_WEARABLES) - count = AvatarWearable.MAX_WEARABLES; + + m_wearables = new AvatarWearable[count]; for (int i = 0; i < count; i++) m_wearables[i] = new AvatarWearable((OSDArray)wears[i]); diff --git a/OpenSim/Framework/AvatarWearable.cs b/OpenSim/Framework/AvatarWearable.cs index e662d5f..80ed77f 100644 --- a/OpenSim/Framework/AvatarWearable.cs +++ b/OpenSim/Framework/AvatarWearable.cs @@ -68,7 +68,7 @@ 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 int MAX_WEARABLES = 16; @@ -225,8 +225,9 @@ namespace OpenSim.Framework { get { - AvatarWearable[] defaultWearables = new AvatarWearable[MAX_WEARABLES]; - for (int i = 0; i < MAX_WEARABLES; i++) + // We use the legacy count here because this is just a fallback anyway + AvatarWearable[] defaultWearables = new AvatarWearable[LEGACY_VERSION_MAX_WEARABLES]; + for (int i = 0; i < LEGACY_VERSION_MAX_WEARABLES; i++) { defaultWearables[i] = new AvatarWearable(); } diff --git a/OpenSim/Framework/ChildAgentDataUpdate.cs b/OpenSim/Framework/ChildAgentDataUpdate.cs index a714d86..2fce155 100644 --- a/OpenSim/Framework/ChildAgentDataUpdate.cs +++ b/OpenSim/Framework/ChildAgentDataUpdate.cs @@ -61,7 +61,7 @@ namespace OpenSim.Framework { UUID AgentID { get; set; } - OSDMap Pack(); + OSDMap Pack(Object parms = null); void Unpack(OSDMap map, IScene scene); } @@ -96,7 +96,7 @@ namespace OpenSim.Framework public Dictionary ChildrenCapSeeds = null; - public OSDMap Pack() + public OSDMap Pack(Object parms = null) { OSDMap args = new OSDMap(); args["message_type"] = OSD.FromString("AgentPosition"); @@ -391,8 +391,18 @@ namespace OpenSim.Framework public Dictionary MovementAnimationOverRides = new Dictionary(); - public virtual OSDMap Pack() + public virtual OSDMap Pack(Object parms = null) { + int wearablesCount = -1; + + if (parms != null) + { + Hashtable p = (Hashtable)parms; + + if (p.ContainsKey("wearablesCount")) + wearablesCount = (int)p["wearablesCount"]; + } + // m_log.InfoFormat("[CHILDAGENTDATAUPDATE] Pack data"); OSDMap args = new OSDMap(); @@ -493,7 +503,7 @@ namespace OpenSim.Framework } if (Appearance != null) - args["packed_appearance"] = Appearance.Pack(); + args["packed_appearance"] = Appearance.Pack(wearablesCount); //if ((AgentTextures != null) && (AgentTextures.Length > 0)) //{ @@ -800,11 +810,7 @@ namespace OpenSim.Framework { OSDArray wears = (OSDArray)(args["wearables"]); - int count = wears.Count; - if (count > AvatarWearable.MAX_WEARABLES) - count = AvatarWearable.MAX_WEARABLES; - - for (int i = 0; i < count / 2; i++) + for (int i = 0; i < wears.Count / 2; i++) { AvatarWearable awear = new AvatarWearable((OSDArray)wears[i]); Appearance.SetWearable(i, awear); @@ -897,9 +903,9 @@ namespace OpenSim.Framework public class CompleteAgentData : AgentData { - public override OSDMap Pack() + public override OSDMap Pack(object parms = null) { - return base.Pack(); + return base.Pack(parms); } public override void Unpack(OSDMap map, IScene scene) diff --git a/OpenSim/Framework/Tests/AgentCircuitDataTest.cs b/OpenSim/Framework/Tests/AgentCircuitDataTest.cs index 95e9439..a2a2eea 100644 --- a/OpenSim/Framework/Tests/AgentCircuitDataTest.cs +++ b/OpenSim/Framework/Tests/AgentCircuitDataTest.cs @@ -312,7 +312,7 @@ namespace OpenSim.Framework.Tests Agent1Data.startpos = StartPos; OSDMap map2; - OSDMap map = Agent1Data.PackAgentCircuitData(); + OSDMap map = Agent1Data.PackAgentCircuitData(-1); try { string str = OSDParser.SerializeJsonString(map); -- cgit v1.1