aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
authorMelanie Thielker2016-08-20 22:41:53 +0100
committerMelanie Thielker2016-08-20 22:42:32 +0100
commit82244cca68328db002e2c00a693d64781737cf7c (patch)
tree4c86d53a2d6d5eb3dde70601ba0821eaf7110bf1 /OpenSim
parentfix GetLandData(...) in land connectors not suporting large regions (diff)
downloadopensim-SC-82244cca68328db002e2c00a693d64781737cf7c.zip
opensim-SC-82244cca68328db002e2c00a693d64781737cf7c.tar.gz
opensim-SC-82244cca68328db002e2c00a693d64781737cf7c.tar.bz2
opensim-SC-82244cca68328db002e2c00a693d64781737cf7c.tar.xz
Allow creation of user appearance from a model avatar. Thank you,
Cinder, for this patch. Signed-off-by: Melanie Thielker <melanie@t-data.com>
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs8
-rw-r--r--OpenSim/Services/UserAccountService/UserAccountService.cs211
2 files changed, 215 insertions, 4 deletions
diff --git a/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs b/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs
index 237ffc7..b22c4cc 100644
--- a/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs
+++ b/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs
@@ -328,12 +328,16 @@ namespace OpenSim.Server.Handlers.UserAccounts
328 if (request.ContainsKey("Email")) 328 if (request.ContainsKey("Email"))
329 email = request["Email"].ToString(); 329 email = request["Email"].ToString();
330 330
331 string model = "";
332 if (request.ContainsKey("Model"))
333 model = request["Model"].ToString();
334
331 UserAccount createdUserAccount = null; 335 UserAccount createdUserAccount = null;
332 336
333 if (m_UserAccountService is UserAccountService) 337 if (m_UserAccountService is UserAccountService)
334 createdUserAccount 338 createdUserAccount
335 = ((UserAccountService)m_UserAccountService).CreateUser( 339 = ((UserAccountService)m_UserAccountService).CreateUser(
336 scopeID, principalID, firstName, lastName, password, email); 340 scopeID, principalID, firstName, lastName, password, email, model);
337 341
338 if (createdUserAccount == null) 342 if (createdUserAccount == null)
339 return FailureResult(); 343 return FailureResult();
@@ -393,4 +397,4 @@ namespace OpenSim.Server.Handlers.UserAccounts
393 return Util.UTF8NoBomEncoding.GetBytes(xmlString); 397 return Util.UTF8NoBomEncoding.GetBytes(xmlString);
394 } 398 }
395 } 399 }
396} \ No newline at end of file 400}
diff --git a/OpenSim/Services/UserAccountService/UserAccountService.cs b/OpenSim/Services/UserAccountService/UserAccountService.cs
index 668fe53..bb50536 100644
--- a/OpenSim/Services/UserAccountService/UserAccountService.cs
+++ b/OpenSim/Services/UserAccountService/UserAccountService.cs
@@ -544,7 +544,8 @@ namespace OpenSim.Services.UserAccountService
544 /// <param name="lastName"></param> 544 /// <param name="lastName"></param>
545 /// <param name="password"></param> 545 /// <param name="password"></param>
546 /// <param name="email"></param> 546 /// <param name="email"></param>
547 public UserAccount CreateUser(UUID scopeID, UUID principalID, string firstName, string lastName, string password, string email) 547 /// <param name="model"></param>
548 public UserAccount CreateUser(UUID scopeID, UUID principalID, string firstName, string lastName, string password, string email, string model = "")
548 { 549 {
549 UserAccount account = GetUserAccount(UUID.Zero, firstName, lastName); 550 UserAccount account = GetUserAccount(UUID.Zero, firstName, lastName);
550 if (null == account) 551 if (null == account)
@@ -603,7 +604,12 @@ namespace OpenSim.Services.UserAccountService
603 } 604 }
604 605
605 if (m_CreateDefaultAvatarEntries) 606 if (m_CreateDefaultAvatarEntries)
606 CreateDefaultAppearanceEntries(account.PrincipalID); 607 {
608 if (String.IsNullOrEmpty(model))
609 CreateDefaultAppearanceEntries(account.PrincipalID);
610 else
611 EstablishAppearance(account.PrincipalID, model);
612 }
607 } 613 }
608 614
609 m_log.InfoFormat( 615 m_log.InfoFormat(
@@ -734,6 +740,7 @@ namespace OpenSim.Services.UserAccountService
734 wearables[AvatarWearable.PANTS] = new AvatarWearable(pants.ID, pants.AssetID); 740 wearables[AvatarWearable.PANTS] = new AvatarWearable(pants.ID, pants.AssetID);
735 741
736 AvatarAppearance ap = new AvatarAppearance(); 742 AvatarAppearance ap = new AvatarAppearance();
743 // this loop works, but is questionable
737 for (int i = 0; i < 6; i++) 744 for (int i = 0; i < 6; i++)
738 { 745 {
739 ap.SetWearable(i, wearables[i]); 746 ap.SetWearable(i, wearables[i]);
@@ -742,5 +749,205 @@ namespace OpenSim.Services.UserAccountService
742 m_AvatarService.SetAppearance(principalID, ap); 749 m_AvatarService.SetAppearance(principalID, ap);
743 } 750 }
744 } 751 }
752
753 protected void EstablishAppearance(UUID destinationAgent, string model)
754 {
755 m_log.DebugFormat("[USER ACCOUNT SERVICE]: Establishing new appearance for {0} - {1}",
756 destinationAgent.ToString(), model);
757
758 string[] modelSpecifiers = model.Split();
759 if (modelSpecifiers.Length != 2)
760 {
761 m_log.WarnFormat("[USER ACCOUNT SERVICE]: Invalid model name \'{0}\'. Falling back to Ruth for {1}",
762 model, destinationAgent);
763 CreateDefaultAppearanceEntries(destinationAgent);
764 return;
765 }
766
767 // Does the source model exist?
768 UserAccount modelAccount = GetUserAccount(UUID.Zero, modelSpecifiers[0], modelSpecifiers[1]);
769 if (modelAccount == null)
770 {
771 m_log.WarnFormat("[USER ACCOUNT SERVICE]: Requested model \'{0}\' not found. Falling back to Ruth for {1}",
772 model, destinationAgent);
773 CreateDefaultAppearanceEntries(destinationAgent);
774 return;
775 }
776
777 // Does the source model have an established appearance herself?
778 AvatarAppearance modelAppearance = m_AvatarService.GetAppearance(modelAccount.PrincipalID);
779 if (modelAppearance == null)
780 {
781 m_log.WarnFormat("USER ACCOUNT SERVICE]: Requested model \'{0}\' does not have an established appearance. Falling back to Ruth for {1}",
782 model, destinationAgent);
783 CreateDefaultAppearanceEntries(destinationAgent);
784 return;
785 }
786
787 try
788 {
789 CopyWearablesAndAttachments(destinationAgent, modelAccount.PrincipalID, modelAppearance);
790
791 m_AvatarService.SetAppearance(destinationAgent, modelAppearance);
792 }
793 catch (Exception e)
794 {
795 m_log.WarnFormat("[USER ACCOUNT SERVICE]: Error transferring appearance for {0} : {1}",
796 destinationAgent, e.Message);
797 }
798
799 m_log.DebugFormat("[USER ACCOUNT SERVICE]: Finished establishing appearance for {0}",
800 destinationAgent.ToString());
801 }
802
803 /// <summary>
804 /// This method is called by EstablishAppearance to do a copy all inventory items
805 /// worn or attached to the Clothing inventory folder of the receiving avatar.
806 /// In parallel the avatar wearables and attachments are updated.
807 /// </summary>
808 private void CopyWearablesAndAttachments(UUID destination, UUID source, AvatarAppearance avatarAppearance)
809 {
810 // Get Clothing folder of receiver
811 InventoryFolderBase destinationFolder = m_InventoryService.GetFolderForType(destination, FolderType.Clothing);
812
813 if (destinationFolder == null)
814 throw new Exception("Cannot locate folder(s)");
815
816 // Missing destination folder? This should *never* be the case
817 if (destinationFolder.Type != (short)FolderType.Clothing)
818 {
819 destinationFolder = new InventoryFolderBase();
820
821 destinationFolder.ID = UUID.Random();
822 destinationFolder.Name = "Clothing";
823 destinationFolder.Owner = destination;
824 destinationFolder.Type = (short)AssetType.Clothing;
825 destinationFolder.ParentID = m_InventoryService.GetRootFolder(destination).ID;
826 destinationFolder.Version = 1;
827 m_InventoryService.AddFolder(destinationFolder); // store base record
828 m_log.ErrorFormat("[USER ACCOUNT SERVICE]: Created folder for destination {0}", source);
829 }
830
831 // Wearables
832 AvatarWearable[] wearables = avatarAppearance.Wearables;
833 AvatarWearable wearable;
834
835 for (int i = 0; i < wearables.Length; i++)
836 {
837 wearable = wearables[i];
838 if (wearable[0].ItemID != UUID.Zero)
839 {
840 // Get inventory item and copy it
841 InventoryItemBase item = m_InventoryService.GetItem(source, wearable[0].ItemID);
842
843 if (item != null)
844 {
845 InventoryItemBase destinationItem = new InventoryItemBase(UUID.Random(), destination);
846 destinationItem.Name = item.Name;
847 destinationItem.Owner = destination;
848 destinationItem.Description = item.Description;
849 destinationItem.InvType = item.InvType;
850 destinationItem.CreatorId = item.CreatorId;
851 destinationItem.CreatorData = item.CreatorData;
852 destinationItem.NextPermissions = item.NextPermissions;
853 destinationItem.CurrentPermissions = item.CurrentPermissions;
854 destinationItem.BasePermissions = item.BasePermissions;
855 destinationItem.EveryOnePermissions = item.EveryOnePermissions;
856 destinationItem.GroupPermissions = item.GroupPermissions;
857 destinationItem.AssetType = item.AssetType;
858 destinationItem.AssetID = item.AssetID;
859 destinationItem.GroupID = item.GroupID;
860 destinationItem.GroupOwned = item.GroupOwned;
861 destinationItem.SalePrice = item.SalePrice;
862 destinationItem.SaleType = item.SaleType;
863 destinationItem.Flags = item.Flags;
864 destinationItem.CreationDate = item.CreationDate;
865 destinationItem.Folder = destinationFolder.ID;
866 ApplyNextOwnerPermissions(destinationItem);
867
868 m_InventoryService.AddItem(destinationItem);
869 m_log.DebugFormat("[USER ACCOUNT SERVICE]: Added item {0} to folder {1}", destinationItem.ID, destinationFolder.ID);
870
871 // Wear item
872 AvatarWearable newWearable = new AvatarWearable();
873 newWearable.Wear(destinationItem.ID, wearable[0].AssetID);
874 avatarAppearance.SetWearable(i, newWearable);
875 }
876 else
877 {
878 m_log.WarnFormat("[USER ACCOUNT SERVICE]: Error transferring {0} to folder {1}", wearable[0].ItemID, destinationFolder.ID);
879 }
880 }
881 }
882
883 // Attachments
884 List<AvatarAttachment> attachments = avatarAppearance.GetAttachments();
885
886 foreach (AvatarAttachment attachment in attachments)
887 {
888 int attachpoint = attachment.AttachPoint;
889 UUID itemID = attachment.ItemID;
890
891 if (itemID != UUID.Zero)
892 {
893 // Get inventory item and copy it
894 InventoryItemBase item = m_InventoryService.GetItem(source, itemID);
895
896 if (item != null)
897 {
898 InventoryItemBase destinationItem = new InventoryItemBase(UUID.Random(), destination);
899 destinationItem.Name = item.Name;
900 destinationItem.Owner = destination;
901 destinationItem.Description = item.Description;
902 destinationItem.InvType = item.InvType;
903 destinationItem.CreatorId = item.CreatorId;
904 destinationItem.CreatorData = item.CreatorData;
905 destinationItem.NextPermissions = item.NextPermissions;
906 destinationItem.CurrentPermissions = item.CurrentPermissions;
907 destinationItem.BasePermissions = item.BasePermissions;
908 destinationItem.EveryOnePermissions = item.EveryOnePermissions;
909 destinationItem.GroupPermissions = item.GroupPermissions;
910 destinationItem.AssetType = item.AssetType;
911 destinationItem.AssetID = item.AssetID;
912 destinationItem.GroupID = item.GroupID;
913 destinationItem.GroupOwned = item.GroupOwned;
914 destinationItem.SalePrice = item.SalePrice;
915 destinationItem.SaleType = item.SaleType;
916 destinationItem.Flags = item.Flags;
917 destinationItem.CreationDate = item.CreationDate;
918 destinationItem.Folder = destinationFolder.ID;
919 ApplyNextOwnerPermissions(destinationItem);
920
921 m_InventoryService.AddItem(destinationItem);
922 m_log.DebugFormat("[USER ACCOUNT SERVICE]: Added item {0} to folder {1}", destinationItem.ID, destinationFolder.ID);
923
924 // Attach item
925 avatarAppearance.SetAttachment(attachpoint, destinationItem.ID, destinationItem.AssetID);
926 m_log.DebugFormat("[USER ACCOUNT SERVICE]: Attached {0}", destinationItem.ID);
927 }
928 else
929 {
930 m_log.WarnFormat("[USER ACCOUNT SERVICE]: Error transferring {0} to folder {1}", itemID, destinationFolder.ID);
931 }
932 }
933 }
934 }
935
936 /// <summary>
937 /// Apply next owner permissions.
938 /// </summary>
939 private void ApplyNextOwnerPermissions(InventoryItemBase item)
940 {
941 if (item.InvType == (int)InventoryType.Object)
942 {
943 uint perms = item.CurrentPermissions;
944 PermissionsUtil.ApplyFoldedPermissions(item.CurrentPermissions, ref perms);
945 item.CurrentPermissions = perms;
946 }
947
948 item.CurrentPermissions &= item.NextPermissions;
949 item.BasePermissions &= item.NextPermissions;
950 item.EveryOnePermissions &= item.NextPermissions;
951 }
745 } 952 }
746} 953}