aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2011-09-01 23:14:50 +0100
committerJustin Clark-Casey (justincc)2011-09-01 23:14:50 +0100
commit712d44635a0f4552fbac4c6423ab88e027cef8a2 (patch)
treeed38e6cacfe35bfd41cef58781117b5b7f676260 /OpenSim/Region
parentuse group.RootPart in IAM.RezObject() rather than group.GetChildPart(group.UU... (diff)
downloadopensim-SC-712d44635a0f4552fbac4c6423ab88e027cef8a2.zip
opensim-SC-712d44635a0f4552fbac4c6423ab88e027cef8a2.tar.gz
opensim-SC-712d44635a0f4552fbac4c6423ab88e027cef8a2.tar.bz2
opensim-SC-712d44635a0f4552fbac4c6423ab88e027cef8a2.tar.xz
refactor: Move sanity checks to the top of IAM.RezObject() to make the code more readable
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs434
1 files changed, 215 insertions, 219 deletions
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
index e0ff5a8..5778dff 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
@@ -700,276 +700,272 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
700 RayStart, RayEnd, RayTargetID, Quaternion.Identity, 700 RayStart, RayEnd, RayTargetID, Quaternion.Identity,
701 BypassRayCast, bRayEndIsIntersection, true, scale, false); 701 BypassRayCast, bRayEndIsIntersection, true, scale, false);
702 702
703 // Rez object
704 InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); 703 InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId);
705 item = m_Scene.InventoryService.GetItem(item); 704 item = m_Scene.InventoryService.GetItem(item);
706 705
707 if (item != null) 706 if (item == null)
708 { 707 {
709 item.Owner = remoteClient.AgentId; 708 m_log.WarnFormat(
709 "[InventoryAccessModule]: Could not find item {0} for {1} in RezObject()",
710 itemID, remoteClient.Name);
710 711
711 AssetBase rezAsset = m_Scene.AssetService.Get(item.AssetID.ToString()); 712 return null;
713 }
712 714
713 SceneObjectGroup group = null; 715 item.Owner = remoteClient.AgentId;
716 AssetBase rezAsset = m_Scene.AssetService.Get(item.AssetID.ToString());
714 717
715 if (rezAsset != null) 718 if (rezAsset == null)
716 { 719 {
717 UUID itemId = UUID.Zero; 720 m_log.WarnFormat(
721 "[InventoryAccessModule]: Could not find asset {0} for item {1} {2} for {3} in RezObject()",
722 item.AssetID, item.Name, item.ID, remoteClient.Name);
718 723
719 // If we have permission to copy then link the rezzed object back to the user inventory 724 return null;
720 // item that it came from. This allows us to enable 'save object to inventory' 725 }
721 if (!m_Scene.Permissions.BypassPermissions())
722 {
723 if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == (uint)PermissionMask.Copy && (item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0)
724 {
725 itemId = item.ID;
726 }
727 }
728 else
729 {
730 if ((item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0)
731 {
732 // Brave new fullperm world
733 itemId = item.ID;
734 }
735 }
736 726
737 string xmlData = Utils.BytesToString(rezAsset.Data); 727 SceneObjectGroup group = null;
738 List<SceneObjectGroup> objlist = 728 UUID itemId = UUID.Zero;
739 new List<SceneObjectGroup>();
740 List<Vector3> veclist = new List<Vector3>();
741 729
742 XmlDocument doc = new XmlDocument(); 730 // If we have permission to copy then link the rezzed object back to the user inventory
743 doc.LoadXml(xmlData); 731 // item that it came from. This allows us to enable 'save object to inventory'
744 XmlElement e = (XmlElement)doc.SelectSingleNode("/CoalescedObject"); 732 if (!m_Scene.Permissions.BypassPermissions())
745 if (e == null || attachment) // Single 733 {
746 { 734 if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == (uint)PermissionMask.Copy && (item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0)
747 SceneObjectGroup g = 735 {
748 SceneObjectSerializer.FromOriginalXmlFormat( 736 itemId = item.ID;
749 itemId, xmlData); 737 }
750 objlist.Add(g); 738 }
751 veclist.Add(new Vector3(0, 0, 0)); 739 else
752 740 {
753 float offsetHeight = 0; 741 if ((item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0)
754 pos = m_Scene.GetNewRezLocation( 742 {
755 RayStart, RayEnd, RayTargetID, Quaternion.Identity, 743 // Brave new fullperm world
756 BypassRayCast, bRayEndIsIntersection, true, g.GetAxisAlignedBoundingBox(out offsetHeight), false); 744 itemId = item.ID;
757 pos.Z += offsetHeight; 745 }
758 } 746 }
759 else 747
760 { 748 string xmlData = Utils.BytesToString(rezAsset.Data);
761 XmlElement coll = (XmlElement)e; 749 List<SceneObjectGroup> objlist =
762 float bx = Convert.ToSingle(coll.GetAttribute("x")); 750 new List<SceneObjectGroup>();
763 float by = Convert.ToSingle(coll.GetAttribute("y")); 751 List<Vector3> veclist = new List<Vector3>();
764 float bz = Convert.ToSingle(coll.GetAttribute("z"));
765 Vector3 bbox = new Vector3(bx, by, bz);
766 752
767 pos = m_Scene.GetNewRezLocation(RayStart, RayEnd, 753 XmlDocument doc = new XmlDocument();
768 RayTargetID, Quaternion.Identity, 754 doc.LoadXml(xmlData);
769 BypassRayCast, bRayEndIsIntersection, true, 755 XmlElement e = (XmlElement)doc.SelectSingleNode("/CoalescedObject");
770 bbox, false); 756 if (e == null || attachment) // Single
757 {
758 SceneObjectGroup g =
759 SceneObjectSerializer.FromOriginalXmlFormat(
760 itemId, xmlData);
761 objlist.Add(g);
762 veclist.Add(new Vector3(0, 0, 0));
763
764 float offsetHeight = 0;
765 pos = m_Scene.GetNewRezLocation(
766 RayStart, RayEnd, RayTargetID, Quaternion.Identity,
767 BypassRayCast, bRayEndIsIntersection, true, g.GetAxisAlignedBoundingBox(out offsetHeight), false);
768 pos.Z += offsetHeight;
769 }
770 else
771 {
772 XmlElement coll = (XmlElement)e;
773 float bx = Convert.ToSingle(coll.GetAttribute("x"));
774 float by = Convert.ToSingle(coll.GetAttribute("y"));
775 float bz = Convert.ToSingle(coll.GetAttribute("z"));
776 Vector3 bbox = new Vector3(bx, by, bz);
771 777
772 pos -= bbox / 2; 778 pos = m_Scene.GetNewRezLocation(RayStart, RayEnd,
779 RayTargetID, Quaternion.Identity,
780 BypassRayCast, bRayEndIsIntersection, true,
781 bbox, false);
773 782
774 XmlNodeList groups = e.SelectNodes("SceneObjectGroup"); 783 pos -= bbox / 2;
775 foreach (XmlNode n in groups) 784
776 { 785 XmlNodeList groups = e.SelectNodes("SceneObjectGroup");
777 SceneObjectGroup g = 786 foreach (XmlNode n in groups)
778 SceneObjectSerializer.FromOriginalXmlFormat( 787 {
779 itemId, n.OuterXml); 788 SceneObjectGroup g =
780 objlist.Add(g); 789 SceneObjectSerializer.FromOriginalXmlFormat(
781 XmlElement el = (XmlElement)n; 790 itemId, n.OuterXml);
782 791 objlist.Add(g);
783 string rawX = el.GetAttribute("offsetx"); 792 XmlElement el = (XmlElement)n;
784 string rawY = el.GetAttribute("offsety"); 793
785 string rawZ = el.GetAttribute("offsetz"); 794 string rawX = el.GetAttribute("offsetx");
795 string rawY = el.GetAttribute("offsety");
796 string rawZ = el.GetAttribute("offsetz");
786// 797//
787// m_log.DebugFormat( 798// m_log.DebugFormat(
788// "[INVENTORY ACCESS MODULE]: Converting coalesced object {0} offset <{1}, {2}, {3}>", 799// "[INVENTORY ACCESS MODULE]: Converting coalesced object {0} offset <{1}, {2}, {3}>",
789// g.Name, rawX, rawY, rawZ); 800// g.Name, rawX, rawY, rawZ);
790
791 float x = Convert.ToSingle(rawX);
792 float y = Convert.ToSingle(rawY);
793 float z = Convert.ToSingle(rawZ);
794 veclist.Add(new Vector3(x, y, z));
795 }
796 }
797 801
798 int primcount = 0; 802 float x = Convert.ToSingle(rawX);
799 foreach (SceneObjectGroup g in objlist) 803 float y = Convert.ToSingle(rawY);
800 primcount += g.PrimCount; 804 float z = Convert.ToSingle(rawZ);
805 veclist.Add(new Vector3(x, y, z));
806 }
807 }
801 808
802 if (!m_Scene.Permissions.CanRezObject( 809 int primcount = 0;
803 primcount, remoteClient.AgentId, pos) 810 foreach (SceneObjectGroup g in objlist)
804 && !attachment) 811 primcount += g.PrimCount;
805 {
806 // The client operates in no fail mode. It will
807 // have already removed the item from the folder
808 // if it's no copy.
809 // Put it back if it's not an attachment
810 //
811 if (((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) && (!attachment))
812 remoteClient.SendBulkUpdateInventory(item);
813 812
814 return null; 813 if (!m_Scene.Permissions.CanRezObject(
815 } 814 primcount, remoteClient.AgentId, pos)
815 && !attachment)
816 {
817 // The client operates in no fail mode. It will
818 // have already removed the item from the folder
819 // if it's no copy.
820 // Put it back if it's not an attachment
821 //
822 if (((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) && (!attachment))
823 remoteClient.SendBulkUpdateInventory(item);
816 824
817 for (int i = 0 ; i < objlist.Count; i++) 825 return null;
818 { 826 }
819 group = objlist[i]; 827
828 for (int i = 0 ; i < objlist.Count; i++)
829 {
830 group = objlist[i];
820 831
821// Vector3 storedPosition = group.AbsolutePosition; 832// Vector3 storedPosition = group.AbsolutePosition;
822 if (group.UUID == UUID.Zero) 833 if (group.UUID == UUID.Zero)
823 { 834 {
824 m_log.Debug("[InventoryAccessModule]: Inventory object has UUID.Zero! Position 3"); 835 m_log.Debug("[InventoryAccessModule]: Inventory object has UUID.Zero! Position 3");
825 } 836 }
826 837
827 group.RootPart.FromFolderID = item.Folder; 838 group.RootPart.FromFolderID = item.Folder;
828 839
829 // If it's rezzed in world, select it. Much easier to 840 // If it's rezzed in world, select it. Much easier to
830 // find small items. 841 // find small items.
831 // 842 //
832 if (!attachment) 843 if (!attachment)
833 { 844 {
834 group.RootPart.CreateSelected = true; 845 group.RootPart.CreateSelected = true;
835 foreach (SceneObjectPart child in group.Parts) 846 foreach (SceneObjectPart child in group.Parts)
836 child.CreateSelected = true; 847 child.CreateSelected = true;
837 } 848 }
838 849
839 group.ResetIDs(); 850 group.ResetIDs();
840 851
841 if (attachment) 852 if (attachment)
842 { 853 {
843 group.RootPart.Flags |= PrimFlags.Phantom; 854 group.RootPart.Flags |= PrimFlags.Phantom;
844 group.IsAttachment = true; 855 group.IsAttachment = true;
845 } 856 }
846 857
847 // If we're rezzing an attachment then don't ask 858 // If we're rezzing an attachment then don't ask
848 // AddNewSceneObject() to update the client since 859 // AddNewSceneObject() to update the client since
849 // we'll be doing that later on. Scheduling more than 860 // we'll be doing that later on. Scheduling more than
850 // one full update during the attachment 861 // one full update during the attachment
851 // process causes some clients to fail to display the 862 // process causes some clients to fail to display the
852 // attachment properly. 863 // attachment properly.
853 m_Scene.AddNewSceneObject(group, true, false); 864 m_Scene.AddNewSceneObject(group, true, false);
854 865
855 // if attachment we set it's asset id so object updates 866 // if attachment we set it's asset id so object updates
856 // can reflect that, if not, we set it's position in world. 867 // can reflect that, if not, we set it's position in world.
857 if (!attachment) 868 if (!attachment)
858 { 869 {
859 group.ScheduleGroupForFullUpdate(); 870 group.ScheduleGroupForFullUpdate();
860
861 group.AbsolutePosition = pos + veclist[i];
862 }
863 else
864 {
865 group.SetFromItemID(itemID);
866 }
867 871
868 SceneObjectPart rootPart = group.RootPart; 872 group.AbsolutePosition = pos + veclist[i];
873 }
874 else
875 {
876 group.SetFromItemID(itemID);
877 }
869 878
870 // Since renaming the item in the inventory does not 879 SceneObjectPart rootPart = group.RootPart;
871 // affect the name stored in the serialization, transfer
872 // the correct name from the inventory to the
873 // object itself before we rez.
874 //
875 // Only do these for the first object if we are rezzing a coalescence.
876 if (i == 0)
877 {
878 rootPart.Name = item.Name;
879 rootPart.Description = item.Description;
880 rootPart.ObjectSaleType = item.SaleType;
881 rootPart.SalePrice = item.SalePrice;
882 }
883 880
884 group.SetGroup(remoteClient.ActiveGroupId, remoteClient); 881 // Since renaming the item in the inventory does not
885 if ((rootPart.OwnerID != item.Owner) || 882 // affect the name stored in the serialization, transfer
886 (item.CurrentPermissions & 16) != 0) 883 // the correct name from the inventory to the
887 { 884 // object itself before we rez.
888 //Need to kill the for sale here 885 //
889 rootPart.ObjectSaleType = 0; 886 // Only do these for the first object if we are rezzing a coalescence.
890 rootPart.SalePrice = 10; 887 if (i == 0)
888 {
889 rootPart.Name = item.Name;
890 rootPart.Description = item.Description;
891 rootPart.ObjectSaleType = item.SaleType;
892 rootPart.SalePrice = item.SalePrice;
893 }
891 894
892 if (m_Scene.Permissions.PropagatePermissions()) 895 group.SetGroup(remoteClient.ActiveGroupId, remoteClient);
893 { 896 if ((rootPart.OwnerID != item.Owner) ||
894 foreach (SceneObjectPart part in group.Parts) 897 (item.CurrentPermissions & 16) != 0)
895 { 898 {
896 if ((item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0) 899 //Need to kill the for sale here
897 { 900 rootPart.ObjectSaleType = 0;
898 part.EveryoneMask = item.EveryOnePermissions; 901 rootPart.SalePrice = 10;
899 part.NextOwnerMask = item.NextPermissions;
900 }
901 part.GroupMask = 0; // DO NOT propagate here
902 }
903
904 group.ApplyNextOwnerPermissions();
905 }
906 }
907 902
903 if (m_Scene.Permissions.PropagatePermissions())
904 {
908 foreach (SceneObjectPart part in group.Parts) 905 foreach (SceneObjectPart part in group.Parts)
909 { 906 {
910 if ((part.OwnerID != item.Owner) || 907 if ((item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0)
911 (item.CurrentPermissions & 16) != 0)
912 { 908 {
913 part.LastOwnerID = part.OwnerID; 909 part.EveryoneMask = item.EveryOnePermissions;
914 part.OwnerID = item.Owner; 910 part.NextOwnerMask = item.NextPermissions;
915 part.Inventory.ChangeInventoryOwner(item.Owner);
916 part.GroupMask = 0; // DO NOT propagate here
917 } 911 }
918 part.EveryoneMask = item.EveryOnePermissions; 912 part.GroupMask = 0; // DO NOT propagate here
919 part.NextOwnerMask = item.NextPermissions;
920 } 913 }
921 914
922 rootPart.TrimPermissions(); 915 group.ApplyNextOwnerPermissions();
923
924 if (!attachment)
925 {
926 if (group.RootPart.Shape.PCode == (byte)PCode.Prim)
927 group.ClearPartAttachmentData();
928
929 // Fire on_rez
930 group.CreateScriptInstances(0, true, m_Scene.DefaultScriptEngine, 1);
931 rootPart.ParentGroup.ResumeScripts();
932
933 rootPart.ScheduleFullUpdate();
934 }
935
936// m_log.DebugFormat(
937// "[InventoryAccessModule]: Rezzed {0} {1} {2} for {3}",
938// group.Name, group.LocalId, group.UUID, remoteClient.Name);
939 } 916 }
917 }
940 918
941 if (!m_Scene.Permissions.BypassPermissions()) 919 foreach (SceneObjectPart part in group.Parts)
920 {
921 if ((part.OwnerID != item.Owner) ||
922 (item.CurrentPermissions & 16) != 0)
942 { 923 {
943 if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) 924 part.LastOwnerID = part.OwnerID;
944 { 925 part.OwnerID = item.Owner;
945 // If this is done on attachments, no 926 part.Inventory.ChangeInventoryOwner(item.Owner);
946 // copy ones will be lost, so avoid it 927 part.GroupMask = 0; // DO NOT propagate here
947 //
948 if (!attachment)
949 {
950 List<UUID> uuids = new List<UUID>();
951 uuids.Add(item.ID);
952 m_Scene.InventoryService.DeleteItems(item.Owner, uuids);
953 }
954 }
955 } 928 }
929 part.EveryoneMask = item.EveryOnePermissions;
930 part.NextOwnerMask = item.NextPermissions;
956 } 931 }
957 else 932
933 rootPart.TrimPermissions();
934
935 if (!attachment)
958 { 936 {
959 m_log.WarnFormat( 937 if (group.RootPart.Shape.PCode == (byte)PCode.Prim)
960 "[InventoryAccessModule]: Could not find asset {0} for item {1} {2} for {3} in RezObject()", item.AssetID, item.Name, item.ID, remoteClient.Name); 938 group.ClearPartAttachmentData();
939
940 // Fire on_rez
941 group.CreateScriptInstances(0, true, m_Scene.DefaultScriptEngine, 1);
942 rootPart.ParentGroup.ResumeScripts();
943
944 rootPart.ScheduleFullUpdate();
961 } 945 }
962 946
963 return group; 947// m_log.DebugFormat(
948// "[InventoryAccessModule]: Rezzed {0} {1} {2} for {3}",
949// group.Name, group.LocalId, group.UUID, remoteClient.Name);
964 } 950 }
965 else 951
952 if (!m_Scene.Permissions.BypassPermissions())
966 { 953 {
967 m_log.WarnFormat( 954 if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0)
968 "[InventoryAccessModule]: Could not find item {0} for {1} in RezObject()", 955 {
969 itemID, remoteClient.Name); 956 // If this is done on attachments, no
957 // copy ones will be lost, so avoid it
958 //
959 if (!attachment)
960 {
961 List<UUID> uuids = new List<UUID>();
962 uuids.Add(item.ID);
963 m_Scene.InventoryService.DeleteItems(item.Owner, uuids);
964 }
965 }
970 } 966 }
971 967
972 return null; 968 return group;
973 } 969 }
974 970
975 protected void AddUserData(SceneObjectGroup sog) 971 protected void AddUserData(SceneObjectGroup sog)