diff --git a/OpenSim/Framework/AnimationSet.cs b/OpenSim/Framework/AnimationSet.cs index 56e1068b4e..8ac90815e1 100644 --- a/OpenSim/Framework/AnimationSet.cs +++ b/OpenSim/Framework/AnimationSet.cs @@ -35,7 +35,7 @@ namespace OpenSim.Framework public class AnimationSet { - private readonly int m_maxAnimations = 255; + private bool m_parseError = false; public const uint createBasePermitions = (uint)(PermissionMask.All); // no export ? public const uint createNextPermitions = (uint)(PermissionMask.Copy | PermissionMask.Modify); @@ -86,50 +86,41 @@ namespace OpenSim.Framework } public int AnimationCount { get; private set; } - private Dictionary m_animations = new Dictionary(); - - public UUID AnimationAt(int index) + private Dictionary m_animations = new Dictionary(); + public AnimationSet(Byte[] data) { - if (m_animations.ContainsKey(index)) - return m_animations[index]; - return UUID.Zero; - } - - public void SetAnimation(int index, UUID animation) - { - if (index < 0 || index > m_maxAnimations) - return; - - m_animations[index] = animation; - } - - public AnimationSet(Byte[] assetData) - { - if (assetData.Length < 2) - throw new System.ArgumentException(); - - if (assetData[0] != 1) // Only version 1 is supported - throw new System.ArgumentException(); - - AnimationCount = assetData[1]; - if (assetData.Length - 2 != 16 * AnimationCount) - throw new System.ArgumentException(); - - // TODO: Read anims from blob + string assetData = System.Text.Encoding.ASCII.GetString(data); + Console.WriteLine("--------------------"); + Console.WriteLine("AnimationSet length {0} bytes", assetData.Length); + Console.WriteLine("Data: {0}", assetData); + Console.WriteLine("--------------------"); } public Byte[] ToBytes() { - // TODO: Make blob from anims - return new Byte[0]; + // If there was an error parsing the input, we give back an + // empty set rather than the original data. + if (m_parseError) + { + string dummy = "version 1\ncount 0\n"; + return System.Text.Encoding.ASCII.GetBytes(dummy); + } + + string assetData = String.Format("version 1\ncount {0}\n", m_animations.Count); + foreach (KeyValuePair kvp in m_animations) + assetData += String.Format("{0} {1}\n", kvp.Key, kvp.Value.ToString()); + return System.Text.Encoding.ASCII.GetBytes(assetData); } public bool Validate(AnimationSetValidator val) { - List badAnims = new List(); + if (m_parseError) + return false; + + List badAnims = new List(); bool allOk = true; - foreach (KeyValuePair kvp in m_animations) + foreach (KeyValuePair kvp in m_animations) { if (!val(kvp.Value)) { @@ -138,7 +129,7 @@ namespace OpenSim.Framework } } - foreach (int idx in badAnims) + foreach (string idx in badAnims) m_animations.Remove(idx); return allOk; diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs index 1e14f45c2b..1a19585eeb 100644 --- a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs +++ b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs @@ -172,6 +172,17 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction { AssetXferUploader uploader = RequestXferUploader(transactionID); + // Here we need to get the old asset to extract the + // texture UUIDs if it's a wearable. + if (item.Type == (int)AssetType.Bodypart || + item.Type == (int)AssetType.Clothing || + item.Type == (int)CustomAssetType.AnimationSet) + { + AssetBase oldAsset = m_Scene.AssetService.Get(item.AssetID.ToString()); + if (oldAsset != null) + uploader.SetOldData(oldAsset.Data); + } + uploader.RequestUpdateTaskInventoryItem(remoteClient, item); } @@ -180,6 +191,17 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction { AssetXferUploader uploader = RequestXferUploader(transactionID); + // Here we need to get the old asset to extract the + // texture UUIDs if it's a wearable. + if (item.AssetType == (int)AssetType.Bodypart || + item.AssetType == (int)AssetType.Clothing || + item.AssetType == (int)CustomAssetType.AnimationSet) + { + AssetBase oldAsset = m_Scene.AssetService.Get(item.AssetID.ToString()); + if (oldAsset != null) + uploader.SetOldData(oldAsset.Data); + } + uploader.RequestUpdateInventoryItem(remoteClient, item); } } diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs index b3dc0c0927..64a9610e1c 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs @@ -278,6 +278,20 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess remoteClient.SendAlertMessage("Script saved"); } + else if ((CustomInventoryType)item.InvType == CustomInventoryType.AnimationSet) + { + AnimationSet animSet = new AnimationSet(data); + if (!animSet.Validate(x => { + int perms = m_Scene.InventoryService.GetAssetPermissions(remoteClient.AgentId, x); + int required = (int)(PermissionMask.Transfer | PermissionMask.Copy); + if ((perms & required) != required) + return false; + return true; + })) + { + data = animSet.ToBytes(); + } + } AssetBase asset = CreateAsset(item.Name, item.Description, (sbyte)item.AssetType, data, remoteClient.AgentId.ToString());