aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SceneObjectPart.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs230
1 files changed, 149 insertions, 81 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 7203663..97722b7 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -62,7 +62,8 @@ namespace OpenSim.Region.Framework.Scenes
62 TELEPORT = 512, 62 TELEPORT = 512,
63 REGION_RESTART = 1024, 63 REGION_RESTART = 1024,
64 MEDIA = 2048, 64 MEDIA = 2048,
65 ANIMATION = 16384 65 ANIMATION = 16384,
66 POSITION = 32768
66 } 67 }
67 68
68 // I don't really know where to put this except here. 69 // I don't really know where to put this except here.
@@ -190,7 +191,15 @@ namespace OpenSim.Region.Framework.Scenes
190 191
191 public UUID FromFolderID; 192 public UUID FromFolderID;
192 193
193 194 // The following two are to hold the attachment data
195 // while an object is inworld
196 [XmlIgnore]
197 public byte AttachPoint = 0;
198
199 [XmlIgnore]
200 public Vector3 AttachOffset = Vector3.Zero;
201
202 [XmlIgnore]
194 public int STATUS_ROTATE_X; 203 public int STATUS_ROTATE_X;
195 204
196 205
@@ -272,6 +281,7 @@ namespace OpenSim.Region.Framework.Scenes
272 private Quaternion m_sitTargetOrientation = Quaternion.Identity; 281 private Quaternion m_sitTargetOrientation = Quaternion.Identity;
273 private Vector3 m_sitTargetPosition; 282 private Vector3 m_sitTargetPosition;
274 private string m_sitAnimation = "SIT"; 283 private string m_sitAnimation = "SIT";
284 private bool m_occupied; // KF if any av is sitting on this prim
275 private string m_text = String.Empty; 285 private string m_text = String.Empty;
276 private string m_touchName = String.Empty; 286 private string m_touchName = String.Empty;
277 private readonly Stack<UndoState> m_undo = new Stack<UndoState>(5); 287 private readonly Stack<UndoState> m_undo = new Stack<UndoState>(5);
@@ -315,6 +325,7 @@ namespace OpenSim.Region.Framework.Scenes
315 protected Vector3 m_lastAcceleration; 325 protected Vector3 m_lastAcceleration;
316 protected Vector3 m_lastAngularVelocity; 326 protected Vector3 m_lastAngularVelocity;
317 protected int m_lastTerseSent; 327 protected int m_lastTerseSent;
328 protected float m_buoyancy = 0.0f;
318 329
319 /// <summary> 330 /// <summary>
320 /// Stores media texture data 331 /// Stores media texture data
@@ -367,7 +378,7 @@ namespace OpenSim.Region.Framework.Scenes
367 UUID ownerID, PrimitiveBaseShape shape, Vector3 groupPosition, 378 UUID ownerID, PrimitiveBaseShape shape, Vector3 groupPosition,
368 Quaternion rotationOffset, Vector3 offsetPosition) 379 Quaternion rotationOffset, Vector3 offsetPosition)
369 { 380 {
370 m_name = "Primitive"; 381 m_name = "Object";
371 382
372 Rezzed = DateTime.UtcNow; 383 Rezzed = DateTime.UtcNow;
373 _creationDate = (int)Utils.DateTimeToUnixTime(Rezzed); 384 _creationDate = (int)Utils.DateTimeToUnixTime(Rezzed);
@@ -422,7 +433,7 @@ namespace OpenSim.Region.Framework.Scenes
422 private uint _ownerMask = (uint)PermissionMask.All; 433 private uint _ownerMask = (uint)PermissionMask.All;
423 private uint _groupMask = (uint)PermissionMask.None; 434 private uint _groupMask = (uint)PermissionMask.None;
424 private uint _everyoneMask = (uint)PermissionMask.None; 435 private uint _everyoneMask = (uint)PermissionMask.None;
425 private uint _nextOwnerMask = (uint)PermissionMask.All; 436 private uint _nextOwnerMask = (uint)(PermissionMask.Move | PermissionMask.Modify | PermissionMask.Transfer);
426 private PrimFlags _flags = PrimFlags.None; 437 private PrimFlags _flags = PrimFlags.None;
427 private DateTime m_expires; 438 private DateTime m_expires;
428 private DateTime m_rezzed; 439 private DateTime m_rezzed;
@@ -521,12 +532,16 @@ namespace OpenSim.Region.Framework.Scenes
521 } 532 }
522 533
523 /// <value> 534 /// <value>
524 /// Access should be via Inventory directly - this property temporarily remains for xml serialization purposes 535 /// Get the inventory list
525 /// </value> 536 /// </value>
526 public TaskInventoryDictionary TaskInventory 537 public TaskInventoryDictionary TaskInventory
527 { 538 {
528 get { return m_inventory.Items; } 539 get {
529 set { m_inventory.Items = value; } 540 return m_inventory.Items;
541 }
542 set {
543 m_inventory.Items = value;
544 }
530 } 545 }
531 546
532 /// <summary> 547 /// <summary>
@@ -667,14 +682,12 @@ namespace OpenSim.Region.Framework.Scenes
667 set { m_LoopSoundSlavePrims = value; } 682 set { m_LoopSoundSlavePrims = value; }
668 } 683 }
669 684
670
671 public Byte[] TextureAnimation 685 public Byte[] TextureAnimation
672 { 686 {
673 get { return m_TextureAnimation; } 687 get { return m_TextureAnimation; }
674 set { m_TextureAnimation = value; } 688 set { m_TextureAnimation = value; }
675 } 689 }
676 690
677
678 public Byte[] ParticleSystem 691 public Byte[] ParticleSystem
679 { 692 {
680 get { return m_particleSystem; } 693 get { return m_particleSystem; }
@@ -711,9 +724,11 @@ namespace OpenSim.Region.Framework.Scenes
711 { 724 {
712 // If this is a linkset, we don't want the physics engine mucking up our group position here. 725 // If this is a linkset, we don't want the physics engine mucking up our group position here.
713 PhysicsActor actor = PhysActor; 726 PhysicsActor actor = PhysActor;
714 if (actor != null && _parentID == 0) 727 if (_parentID == 0)
715 { 728 {
716 m_groupPosition = actor.Position; 729 if (actor != null)
730 m_groupPosition = actor.Position;
731 return m_groupPosition;
717 } 732 }
718 733
719 if (m_parentGroup.IsAttachment) 734 if (m_parentGroup.IsAttachment)
@@ -723,12 +738,14 @@ namespace OpenSim.Region.Framework.Scenes
723 return sp.AbsolutePosition; 738 return sp.AbsolutePosition;
724 } 739 }
725 740
741 // use root prim's group position. Physics may have updated it
742 if (ParentGroup.RootPart != this)
743 m_groupPosition = ParentGroup.RootPart.GroupPosition;
726 return m_groupPosition; 744 return m_groupPosition;
727 } 745 }
728 set 746 set
729 { 747 {
730 m_groupPosition = value; 748 m_groupPosition = value;
731
732 PhysicsActor actor = PhysActor; 749 PhysicsActor actor = PhysActor;
733 if (actor != null) 750 if (actor != null)
734 { 751 {
@@ -748,22 +765,13 @@ namespace OpenSim.Region.Framework.Scenes
748 765
749 // Tell the physics engines that this prim changed. 766 // Tell the physics engines that this prim changed.
750 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor); 767 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
768
751 } 769 }
752 catch (Exception e) 770 catch (Exception e)
753 { 771 {
754 m_log.Error("[SCENEOBJECTPART]: GROUP POSITION. " + e.Message); 772 m_log.Error("[SCENEOBJECTPART]: GROUP POSITION. " + e.Message);
755 } 773 }
756 } 774 }
757
758 // TODO if we decide to do sitting in a more SL compatible way (multiple avatars per prim), this has to be fixed, too
759 if (m_sitTargetAvatar != UUID.Zero)
760 {
761 ScenePresence avatar;
762 if (m_parentGroup.Scene.TryGetScenePresence(m_sitTargetAvatar, out avatar))
763 {
764 avatar.ParentPosition = GetWorldPosition();
765 }
766 }
767 } 775 }
768 } 776 }
769 777
@@ -772,7 +780,7 @@ namespace OpenSim.Region.Framework.Scenes
772 get { return m_offsetPosition; } 780 get { return m_offsetPosition; }
773 set 781 set
774 { 782 {
775// StoreUndoState(); 783 Vector3 oldpos = m_offsetPosition;
776 m_offsetPosition = value; 784 m_offsetPosition = value;
777 785
778 if (ParentGroup != null && !ParentGroup.IsDeleted) 786 if (ParentGroup != null && !ParentGroup.IsDeleted)
@@ -787,7 +795,22 @@ namespace OpenSim.Region.Framework.Scenes
787 if (m_parentGroup.Scene != null) 795 if (m_parentGroup.Scene != null)
788 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor); 796 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
789 } 797 }
798
799 if (!m_parentGroup.m_dupeInProgress)
800 {
801 List<ScenePresence> avs = ParentGroup.GetLinkedAvatars();
802 foreach (ScenePresence av in avs)
803 {
804 if (av.LinkedPrim == m_uuid)
805 {
806 Vector3 offset = (m_offsetPosition - oldpos);
807 av.AbsolutePosition += offset;
808 av.SendAvatarDataToAllAgents();
809 }
810 }
811 }
790 } 812 }
813 TriggerScriptChangedEvent(Changed.POSITION);
791 } 814 }
792 } 815 }
793 816
@@ -914,7 +937,16 @@ namespace OpenSim.Region.Framework.Scenes
914 /// <summary></summary> 937 /// <summary></summary>
915 public Vector3 Acceleration 938 public Vector3 Acceleration
916 { 939 {
917 get { return m_acceleration; } 940 get
941 {
942 PhysicsActor actor = PhysActor;
943 if (actor != null)
944 {
945 m_acceleration = actor.Acceleration;
946 }
947 return m_acceleration;
948 }
949
918 set { m_acceleration = value; } 950 set { m_acceleration = value; }
919 } 951 }
920 952
@@ -1245,6 +1277,13 @@ namespace OpenSim.Region.Framework.Scenes
1245 _flags = value; 1277 _flags = value;
1246 } 1278 }
1247 } 1279 }
1280
1281 [XmlIgnore]
1282 public bool IsOccupied // KF If an av is sittingon this prim
1283 {
1284 get { return m_occupied; }
1285 set { m_occupied = value; }
1286 }
1248 1287
1249 1288
1250 public UUID SitTargetAvatar 1289 public UUID SitTargetAvatar
@@ -1303,6 +1342,19 @@ namespace OpenSim.Region.Framework.Scenes
1303 set { m_collisionSoundVolume = value; } 1342 set { m_collisionSoundVolume = value; }
1304 } 1343 }
1305 1344
1345 public float Buoyancy
1346 {
1347 get { return m_buoyancy; }
1348 set
1349 {
1350 m_buoyancy = value;
1351 if (PhysActor != null)
1352 {
1353 PhysActor.Buoyancy = value;
1354 }
1355 }
1356 }
1357
1306 #endregion Public Properties with only Get 1358 #endregion Public Properties with only Get
1307 1359
1308 private uint ApplyMask(uint val, bool set, uint mask) 1360 private uint ApplyMask(uint val, bool set, uint mask)
@@ -1672,6 +1724,9 @@ namespace OpenSim.Region.Framework.Scenes
1672 1724
1673 // Move afterwards ResetIDs as it clears the localID 1725 // Move afterwards ResetIDs as it clears the localID
1674 dupe.LocalId = localID; 1726 dupe.LocalId = localID;
1727 if(dupe.PhysActor != null)
1728 dupe.PhysActor.LocalID = localID;
1729
1675 // This may be wrong... it might have to be applied in SceneObjectGroup to the object that's being duplicated. 1730 // This may be wrong... it might have to be applied in SceneObjectGroup to the object that's being duplicated.
1676 dupe._lastOwnerID = OwnerID; 1731 dupe._lastOwnerID = OwnerID;
1677 1732
@@ -1722,7 +1777,7 @@ namespace OpenSim.Region.Framework.Scenes
1722 PrimitiveBaseShape shape = PrimitiveBaseShape.Create(); 1777 PrimitiveBaseShape shape = PrimitiveBaseShape.Create();
1723 part.Shape = shape; 1778 part.Shape = shape;
1724 1779
1725 part.Name = "Primitive"; 1780 part.Name = "Object";
1726 part._ownerID = UUID.Random(); 1781 part._ownerID = UUID.Random();
1727 1782
1728 return part; 1783 return part;
@@ -2049,19 +2104,17 @@ namespace OpenSim.Region.Framework.Scenes
2049 public Vector3 GetWorldPosition() 2104 public Vector3 GetWorldPosition()
2050 { 2105 {
2051 Quaternion parentRot = ParentGroup.RootPart.RotationOffset; 2106 Quaternion parentRot = ParentGroup.RootPart.RotationOffset;
2052
2053 Vector3 axPos = OffsetPosition; 2107 Vector3 axPos = OffsetPosition;
2054
2055 axPos *= parentRot; 2108 axPos *= parentRot;
2056 Vector3 translationOffsetPosition = axPos; 2109 Vector3 translationOffsetPosition = axPos;
2057 2110 if(_parentID == 0)
2058// m_log.DebugFormat("[SCENE OBJECT PART]: Found group pos {0} for part {1}", GroupPosition, Name); 2111 {
2059 2112 return GroupPosition;
2060 Vector3 worldPos = GroupPosition + translationOffsetPosition; 2113 }
2061 2114 else
2062// m_log.DebugFormat("[SCENE OBJECT PART]: Found world pos {0} for part {1}", worldPos, Name); 2115 {
2063 2116 return ParentGroup.AbsolutePosition + translationOffsetPosition; //KF: Fix child prim position
2064 return worldPos; 2117 }
2065 } 2118 }
2066 2119
2067 /// <summary> 2120 /// <summary>
@@ -2701,17 +2754,18 @@ namespace OpenSim.Region.Framework.Scenes
2701 //Trys to fetch sound id from prim's inventory. 2754 //Trys to fetch sound id from prim's inventory.
2702 //Prim's inventory doesn't support non script items yet 2755 //Prim's inventory doesn't support non script items yet
2703 2756
2704 lock (TaskInventory) 2757 TaskInventory.LockItemsForRead(true);
2758
2759 foreach (KeyValuePair<UUID, TaskInventoryItem> item in TaskInventory)
2705 { 2760 {
2706 foreach (KeyValuePair<UUID, TaskInventoryItem> item in TaskInventory) 2761 if (item.Value.Name == sound)
2707 { 2762 {
2708 if (item.Value.Name == sound) 2763 soundID = item.Value.ItemID;
2709 { 2764 break;
2710 soundID = item.Value.ItemID;
2711 break;
2712 }
2713 } 2765 }
2714 } 2766 }
2767
2768 TaskInventory.LockItemsForRead(false);
2715 } 2769 }
2716 2770
2717 m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence sp) 2771 m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence sp)
@@ -2796,7 +2850,7 @@ namespace OpenSim.Region.Framework.Scenes
2796 2850
2797 public void RotLookAt(Quaternion target, float strength, float damping) 2851 public void RotLookAt(Quaternion target, float strength, float damping)
2798 { 2852 {
2799 rotLookAt(target, strength, damping); 2853 m_parentGroup.rotLookAt(target, strength, damping); // This calls method in SceneObjectGroup.
2800 } 2854 }
2801 2855
2802 public void rotLookAt(Quaternion target, float strength, float damping) 2856 public void rotLookAt(Quaternion target, float strength, float damping)
@@ -3037,8 +3091,8 @@ namespace OpenSim.Region.Framework.Scenes
3037 { 3091 {
3038 const float ROTATION_TOLERANCE = 0.01f; 3092 const float ROTATION_TOLERANCE = 0.01f;
3039 const float VELOCITY_TOLERANCE = 0.001f; 3093 const float VELOCITY_TOLERANCE = 0.001f;
3040 const float POSITION_TOLERANCE = 0.05f; 3094 const float POSITION_TOLERANCE = 0.05f; // I don't like this, but I suppose it's necessary
3041 const int TIME_MS_TOLERANCE = 3000; 3095 const int TIME_MS_TOLERANCE = 200; //llSetPos has a 200ms delay. This should NOT be 3 seconds.
3042 3096
3043 if (m_updateFlag == 1) 3097 if (m_updateFlag == 1)
3044 { 3098 {
@@ -3052,7 +3106,7 @@ namespace OpenSim.Region.Framework.Scenes
3052 Environment.TickCount - m_lastTerseSent > TIME_MS_TOLERANCE) 3106 Environment.TickCount - m_lastTerseSent > TIME_MS_TOLERANCE)
3053 { 3107 {
3054 AddTerseUpdateToAllAvatars(); 3108 AddTerseUpdateToAllAvatars();
3055 ClearUpdateSchedule(); 3109
3056 3110
3057 // This causes the Scene to 'poll' physical objects every couple of frames 3111 // This causes the Scene to 'poll' physical objects every couple of frames
3058 // bad, so it's been replaced by an event driven method. 3112 // bad, so it's been replaced by an event driven method.
@@ -3070,16 +3124,18 @@ namespace OpenSim.Region.Framework.Scenes
3070 m_lastAngularVelocity = AngularVelocity; 3124 m_lastAngularVelocity = AngularVelocity;
3071 m_lastTerseSent = Environment.TickCount; 3125 m_lastTerseSent = Environment.TickCount;
3072 } 3126 }
3127 //Moved this outside of the if clause so updates don't get blocked.. *sigh*
3128 m_updateFlag = 0; //Why were we calling a function to do this? Inefficient! *screams*
3073 } 3129 }
3074 else 3130 else
3075 { 3131 {
3076 if (m_updateFlag == 2) // is a new prim, just created/reloaded or has major changes 3132 if (m_updateFlag == 2) // is a new prim, just created/reloaded or has major changes
3077 { 3133 {
3078 AddFullUpdateToAllAvatars(); 3134 AddFullUpdateToAllAvatars();
3079 ClearUpdateSchedule(); 3135 m_updateFlag = 0; //Same here
3080 } 3136 }
3081 } 3137 }
3082 ClearUpdateSchedule(); 3138 m_updateFlag = 0;
3083 } 3139 }
3084 3140
3085 /// <summary> 3141 /// <summary>
@@ -3107,17 +3163,16 @@ namespace OpenSim.Region.Framework.Scenes
3107 if (!UUID.TryParse(sound, out soundID)) 3163 if (!UUID.TryParse(sound, out soundID))
3108 { 3164 {
3109 // search sound file from inventory 3165 // search sound file from inventory
3110 lock (TaskInventory) 3166 TaskInventory.LockItemsForRead(true);
3167 foreach (KeyValuePair<UUID, TaskInventoryItem> item in TaskInventory)
3111 { 3168 {
3112 foreach (KeyValuePair<UUID, TaskInventoryItem> item in TaskInventory) 3169 if (item.Value.Name == sound && item.Value.Type == (int)AssetType.Sound)
3113 { 3170 {
3114 if (item.Value.Name == sound && item.Value.Type == (int)AssetType.Sound) 3171 soundID = item.Value.ItemID;
3115 { 3172 break;
3116 soundID = item.Value.ItemID;
3117 break;
3118 }
3119 } 3173 }
3120 } 3174 }
3175 TaskInventory.LockItemsForRead(false);
3121 } 3176 }
3122 3177
3123 if (soundID == UUID.Zero) 3178 if (soundID == UUID.Zero)
@@ -3528,7 +3583,7 @@ namespace OpenSim.Region.Framework.Scenes
3528 3583
3529 public void StopLookAt() 3584 public void StopLookAt()
3530 { 3585 {
3531 m_parentGroup.stopLookAt(); 3586 m_parentGroup.stopLookAt(); // This calls method in SceneObjectGroup.
3532 3587
3533 m_parentGroup.ScheduleGroupForTerseUpdate(); 3588 m_parentGroup.ScheduleGroupForTerseUpdate();
3534 } 3589 }
@@ -3579,45 +3634,45 @@ namespace OpenSim.Region.Framework.Scenes
3579 // TODO: May need to fix for group comparison 3634 // TODO: May need to fix for group comparison
3580 if (last.Compare(this)) 3635 if (last.Compare(this))
3581 { 3636 {
3582 // m_log.DebugFormat( 3637 // m_log.DebugFormat(
3583 // "[SCENE OBJECT PART]: Not storing undo for {0} {1} since current state is same as last undo state, initial stack size {2}", 3638 // "[SCENE OBJECT PART]: Not storing undo for {0} {1} since current state is same as last undo state, initial stack size {2}",
3584 // Name, LocalId, m_undo.Count); 3639 // Name, LocalId, m_undo.Count);
3585 3640
3586 return; 3641 return;
3587 } 3642 }
3588 } 3643 }
3589 } 3644 }
3590 3645
3591 // m_log.DebugFormat( 3646 // m_log.DebugFormat(
3592 // "[SCENE OBJECT PART]: Storing undo state for {0} {1}, forGroup {2}, initial stack size {3}", 3647 // "[SCENE OBJECT PART]: Storing undo state for {0} {1}, forGroup {2}, initial stack size {3}",
3593 // Name, LocalId, forGroup, m_undo.Count); 3648 // Name, LocalId, forGroup, m_undo.Count);
3594 3649
3595 if (m_parentGroup.GetSceneMaxUndo() > 0) 3650 if (m_parentGroup.GetSceneMaxUndo() > 0)
3596 { 3651 {
3597 UndoState nUndo = new UndoState(this, forGroup); 3652 UndoState nUndo = new UndoState(this, forGroup);
3598 3653
3599 m_undo.Push(nUndo); 3654 m_undo.Push(nUndo);
3600 3655
3601 if (m_redo.Count > 0) 3656 if (m_redo.Count > 0)
3602 m_redo.Clear(); 3657 m_redo.Clear();
3603 3658
3604 // m_log.DebugFormat( 3659 // m_log.DebugFormat(
3605 // "[SCENE OBJECT PART]: Stored undo state for {0} {1}, forGroup {2}, stack size now {3}", 3660 // "[SCENE OBJECT PART]: Stored undo state for {0} {1}, forGroup {2}, stack size now {3}",
3606 // Name, LocalId, forGroup, m_undo.Count); 3661 // Name, LocalId, forGroup, m_undo.Count);
3607 } 3662 }
3608 } 3663 }
3609 } 3664 }
3610 } 3665 }
3611// else 3666 // else
3612// { 3667 // {
3613// m_log.DebugFormat("[SCENE OBJECT PART]: Ignoring undo store for {0} {1}", Name, LocalId); 3668 // m_log.DebugFormat("[SCENE OBJECT PART]: Ignoring undo store for {0} {1}", Name, LocalId);
3614// } 3669 // }
3615 } 3670 }
3616// else 3671 // else
3617// { 3672 // {
3618// m_log.DebugFormat( 3673 // m_log.DebugFormat(
3619// "[SCENE OBJECT PART]: Ignoring undo store for {0} {1} since already undoing", Name, LocalId); 3674 // "[SCENE OBJECT PART]: Ignoring undo store for {0} {1} since already undoing", Name, LocalId);
3620// } 3675 // }
3621 } 3676 }
3622 3677
3623 /// <summary> 3678 /// <summary>
@@ -4667,8 +4722,9 @@ namespace OpenSim.Region.Framework.Scenes
4667 { 4722 {
4668 m_shape.TextureEntry = textureEntry; 4723 m_shape.TextureEntry = textureEntry;
4669 TriggerScriptChangedEvent(Changed.TEXTURE); 4724 TriggerScriptChangedEvent(Changed.TEXTURE);
4670 4725 m_updateFlag = 1;
4671 ParentGroup.HasGroupChanged = true; 4726 ParentGroup.HasGroupChanged = true;
4727
4672 //This is madness.. 4728 //This is madness..
4673 //ParentGroup.ScheduleGroupForFullUpdate(); 4729 //ParentGroup.ScheduleGroupForFullUpdate();
4674 //This is sparta 4730 //This is sparta
@@ -4859,5 +4915,17 @@ namespace OpenSim.Region.Framework.Scenes
4859 Color color = Color; 4915 Color color = Color;
4860 return new Color4(color.R, color.G, color.B, (byte)(0xFF - color.A)); 4916 return new Color4(color.R, color.G, color.B, (byte)(0xFF - color.A));
4861 } 4917 }
4918
4919 public void ResetOwnerChangeFlag()
4920 {
4921 List<UUID> inv = Inventory.GetInventoryList();
4922
4923 foreach (UUID itemID in inv)
4924 {
4925 TaskInventoryItem item = Inventory.GetInventoryItem(itemID);
4926 item.OwnerChanged = false;
4927 Inventory.UpdateInventoryItem(item, false, false);
4928 }
4929 }
4862 } 4930 }
4863} 4931}