From a71d9c95cf8af33ff878475067f35a7350868592 Mon Sep 17 00:00:00 2001 From: MW Date: Mon, 1 Jun 2009 11:16:07 +0000 Subject: [PATCH] Some changes to the AvatarCreationModule to reduce the number of database reads/writes. Still requires more work in this area. --- .../AvatarCreationModule.cs | 155 ++++++++++-------- 1 file changed, 86 insertions(+), 69 deletions(-) diff --git a/OpenSim/Grid/UserServer.Modules/AvatarCreationModule.cs b/OpenSim/Grid/UserServer.Modules/AvatarCreationModule.cs index 35c8bd4cd9..908049342e 100644 --- a/OpenSim/Grid/UserServer.Modules/AvatarCreationModule.cs +++ b/OpenSim/Grid/UserServer.Modules/AvatarCreationModule.cs @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) Contributors, http://opensimulator.org/ * See CONTRIBUTORS.TXT for a full list of copyright holders. * @@ -69,7 +69,7 @@ namespace OpenSim.Grid.UserServer.Modules { console.Commands.AddCommand("userserver", false, "clone avatar", "clone avatar ", - "Clone the template avatar inventory into a target avatar", RunCommand); + "Clone the template avatar's inventory into a target avatar", RunCommand); } } @@ -145,7 +145,7 @@ namespace OpenSim.Grid.UserServer.Modules if (removeTargetsClothes) { - //remove clothes and attachments from target avatar so that the end result isn't a merge of its existing clothes + //remove clothes and attachments from target avatar so that the end result isn't a merger of its existing clothes // and the clothes from the template avatar. RemoveClothesAndAttachments(avID); } @@ -204,6 +204,9 @@ namespace OpenSim.Grid.UserServer.Modules "POST", m_inventoryServerUrl + "GetItems/", templateFolderId.Guid); if ((templateItems != null) && (templateItems.Count > 0)) { + List wornClothes = new List(); + List attachedItems = new List(); + foreach (InventoryItemBase item in templateItems) { @@ -213,7 +216,8 @@ namespace OpenSim.Grid.UserServer.Modules int appearanceType = ItemIsPartOfAppearance(item, appearance); if (appearanceType >= 0) { - UpdateAvatarAppearance(avID, appearanceType, clonedItemId, item.AssetID); + // UpdateAvatarAppearance(avID, appearanceType, clonedItemId, item.AssetID); + wornClothes.Add(new ClothesAttachment(appearanceType, clonedItemId, item.AssetID)); } if (appearance != null) @@ -221,12 +225,36 @@ namespace OpenSim.Grid.UserServer.Modules int attachment = appearance.GetAttachpoint(item.ID); if (attachment > 0) { - UpdateAvatarAttachment(avID, attachment, clonedItemId, item.AssetID); + //UpdateAvatarAttachment(avID, attachment, clonedItemId, item.AssetID); + attachedItems.Add(new ClothesAttachment(attachment, clonedItemId, item.AssetID)); } } success = true; } } + + if ((wornClothes.Count > 0) || (attachedItems.Count > 0)) + { + //Update the worn clothes and attachments + AvatarAppearance targetAppearance = GetAppearance(avID); + if (targetAppearance != null) + { + foreach (ClothesAttachment wornItem in wornClothes) + { + targetAppearance.Wearables[wornItem.Type].AssetID = wornItem.AssetID; + targetAppearance.Wearables[wornItem.Type].ItemID = wornItem.ItemID; + } + + foreach (ClothesAttachment wornItem in attachedItems) + { + targetAppearance.SetAttachment(wornItem.Type, wornItem.ItemID, wornItem.AssetID); + } + + m_userDataBaseService.UpdateUserAppearance(avID, targetAppearance); + wornClothes.Clear(); + attachedItems.Clear(); + } + } } List subFolders = FindSubFolders(templateFolder.ID.Guid, templateFolders); @@ -288,40 +316,27 @@ namespace OpenSim.Grid.UserServer.Modules private void UpdateAvatarAppearance(UUID avatarID, int wearableType, UUID itemID, UUID assetID) { - AvatarAppearance appearance = m_userDataBaseService.GetUserAppearance(avatarID); - if (appearance == null) - { - appearance = CreateDefaultAppearance(avatarID); - } + AvatarAppearance appearance = GetAppearance(avatarID); appearance.Wearables[wearableType].AssetID = assetID; appearance.Wearables[wearableType].ItemID = itemID; m_userDataBaseService.UpdateUserAppearance(avatarID, appearance); - } + private void UpdateAvatarAttachment(UUID avatarID, int attachmentPoint, UUID itemID, UUID assetID) { - AvatarAppearance appearance = m_userDataBaseService.GetUserAppearance(avatarID); - if (appearance == null) - { - appearance = CreateDefaultAppearance(avatarID); - } + AvatarAppearance appearance = GetAppearance(avatarID); appearance.SetAttachment(attachmentPoint, itemID, assetID); m_userDataBaseService.UpdateUserAppearance(avatarID, appearance); - } private void RemoveClothesAndAttachments(UUID avatarID) { - AvatarAppearance appearance = m_userDataBaseService.GetUserAppearance(avatarID); - if (appearance == null) - { - appearance = CreateDefaultAppearance(avatarID); - } + AvatarAppearance appearance = GetAppearance(avatarID); appearance.ClearWearables(); appearance.ClearAttachments(); @@ -329,6 +344,16 @@ namespace OpenSim.Grid.UserServer.Modules } + private AvatarAppearance GetAppearance(UUID avatarID) + { + AvatarAppearance appearance = m_userDataBaseService.GetUserAppearance(avatarID); + if (appearance == null) + { + appearance = CreateDefaultAppearance(avatarID); + } + return appearance; + } + private UUID FindFolderID(string name, List folders) { foreach (InventoryFolderBase folder in folders) @@ -398,27 +423,6 @@ namespace OpenSim.Grid.UserServer.Modules item.EveryOnePermissions = item.EveryOnePermissions & item.NextPermissions; item.GroupPermissions = item.GroupPermissions & item.NextPermissions; - //set all items to +mod/+copy/- transfer - //if ((item.CurrentPermissions & (uint)PermissionMask.Modify) == 0) - // item.CurrentPermissions |= (uint)PermissionMask.Modify; - - //if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) - // item.CurrentPermissions |= (uint)PermissionMask.Copy; - - //if ((item.CurrentPermissions & (uint)PermissionMask.Transfer) != 0) - // item.CurrentPermissions &= ~(uint)PermissionMask.Transfer; - - //if ((item.NextPermissions & (uint)PermissionMask.Modify) == 0) - // item.NextPermissions |= (uint)PermissionMask.Modify; - - //if ((item.NextPermissions & (uint)PermissionMask.Copy) == 0) - // item.NextPermissions |= (uint)PermissionMask.Copy; - - //if ((item.NextPermissions & (uint)PermissionMask.Transfer) != 0) - // item.NextPermissions &= ~(uint)PermissionMask.Transfer; - - //if ((item.EveryOnePermissions & (uint)PermissionMask.Transfer) != 0) - // item.EveryOnePermissions &= ~(uint)PermissionMask.Transfer; } private AvatarAppearance CreateDefaultAppearance(UUID avatarId) @@ -496,33 +500,46 @@ namespace OpenSim.Grid.UserServer.Modules } #endregion + public enum PermissionMask + { + None = 0, + Transfer = 8192, + Modify = 16384, + Copy = 32768, + Move = 524288, + Damage = 1048576, + All = 2147483647, + } - } - public enum PermissionMask - { - None = 0, - Transfer = 8192, - Modify = 16384, - Copy = 32768, - Move = 524288, - Damage = 1048576, - All = 2147483647, - } + public enum WearableType + { + Shape = 0, + Skin = 1, + Hair = 2, + Eyes = 3, + Shirt = 4, + Pants = 5, + Shoes = 6, + Socks = 7, + Jacket = 8, + Gloves = 9, + Undershirt = 10, + Underpants = 11, + Skirt = 12, + } - public enum WearableType - { - Shape = 0, - Skin = 1, - Hair = 2, - Eyes = 3, - Shirt = 4, - Pants = 5, - Shoes = 6, - Socks = 7, - Jacket = 8, - Gloves = 9, - Undershirt = 10, - Underpants = 11, - Skirt = 12, + public class ClothesAttachment + { + public int Type; + public UUID ItemID; + public UUID AssetID; + + public ClothesAttachment(int type, UUID itemID, UUID assetID) + { + Type = type; + ItemID = itemID; + AssetID = assetID; + } + } } }