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.cs210
1 files changed, 114 insertions, 96 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 0698411..b552cdc 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -147,7 +147,7 @@ namespace OpenSim.Region.Framework.Scenes
147 147
148 // TODO: This needs to be persisted in next XML version update! 148 // TODO: This needs to be persisted in next XML version update!
149 [XmlIgnore] 149 [XmlIgnore]
150 public readonly int[] PayPrice = {-2,-2,-2,-2,-2}; 150 public int[] PayPrice = {-2,-2,-2,-2,-2};
151 [XmlIgnore] 151 [XmlIgnore]
152 public PhysicsActor PhysActor; 152 public PhysicsActor PhysActor;
153 153
@@ -277,6 +277,7 @@ namespace OpenSim.Region.Framework.Scenes
277 private Quaternion m_sitTargetOrientation = Quaternion.Identity; 277 private Quaternion m_sitTargetOrientation = Quaternion.Identity;
278 private Vector3 m_sitTargetPosition; 278 private Vector3 m_sitTargetPosition;
279 private string m_sitAnimation = "SIT"; 279 private string m_sitAnimation = "SIT";
280 private bool m_occupied; // KF if any av is sitting on this prim
280 private string m_text = String.Empty; 281 private string m_text = String.Empty;
281 private string m_touchName = String.Empty; 282 private string m_touchName = String.Empty;
282 private readonly UndoStack<UndoState> m_undo = new UndoStack<UndoState>(5); 283 private readonly UndoStack<UndoState> m_undo = new UndoStack<UndoState>(5);
@@ -360,7 +361,7 @@ namespace OpenSim.Region.Framework.Scenes
360 UUID ownerID, PrimitiveBaseShape shape, Vector3 groupPosition, 361 UUID ownerID, PrimitiveBaseShape shape, Vector3 groupPosition,
361 Quaternion rotationOffset, Vector3 offsetPosition) 362 Quaternion rotationOffset, Vector3 offsetPosition)
362 { 363 {
363 m_name = "Primitive"; 364 m_name = "Object";
364 365
365 Rezzed = DateTime.UtcNow; 366 Rezzed = DateTime.UtcNow;
366 _creationDate = (int)Utils.DateTimeToUnixTime(Rezzed); 367 _creationDate = (int)Utils.DateTimeToUnixTime(Rezzed);
@@ -456,12 +457,16 @@ namespace OpenSim.Region.Framework.Scenes
456 } 457 }
457 458
458 /// <value> 459 /// <value>
459 /// Access should be via Inventory directly - this property temporarily remains for xml serialization purposes 460 /// Get the inventory list
460 /// </value> 461 /// </value>
461 public TaskInventoryDictionary TaskInventory 462 public TaskInventoryDictionary TaskInventory
462 { 463 {
463 get { return m_inventory.Items; } 464 get {
464 set { m_inventory.Items = value; } 465 return m_inventory.Items;
466 }
467 set {
468 m_inventory.Items = value;
469 }
465 } 470 }
466 471
467 public uint ObjectFlags 472 public uint ObjectFlags
@@ -590,14 +595,12 @@ namespace OpenSim.Region.Framework.Scenes
590 set { m_LoopSoundSlavePrims = value; } 595 set { m_LoopSoundSlavePrims = value; }
591 } 596 }
592 597
593 [XmlIgnore]
594 public Byte[] TextureAnimation 598 public Byte[] TextureAnimation
595 { 599 {
596 get { return m_TextureAnimation; } 600 get { return m_TextureAnimation; }
597 set { m_TextureAnimation = value; } 601 set { m_TextureAnimation = value; }
598 } 602 }
599 603
600 [XmlIgnore]
601 public Byte[] ParticleSystem 604 public Byte[] ParticleSystem
602 { 605 {
603 get { return m_particleSystem; } 606 get { return m_particleSystem; }
@@ -651,7 +654,6 @@ namespace OpenSim.Region.Framework.Scenes
651 set 654 set
652 { 655 {
653 m_groupPosition = value; 656 m_groupPosition = value;
654
655 PhysicsActor actor = PhysActor; 657 PhysicsActor actor = PhysActor;
656 if (actor != null) 658 if (actor != null)
657 { 659 {
@@ -698,7 +700,7 @@ namespace OpenSim.Region.Framework.Scenes
698 get { return m_offsetPosition; } 700 get { return m_offsetPosition; }
699 set 701 set
700 { 702 {
701 StoreUndoState(); 703 StoreUndoState(UndoType.STATE_PRIM_POSITION);
702 m_offsetPosition = value; 704 m_offsetPosition = value;
703 705
704 if (ParentGroup != null && !ParentGroup.IsDeleted) 706 if (ParentGroup != null && !ParentGroup.IsDeleted)
@@ -712,6 +714,12 @@ namespace OpenSim.Region.Framework.Scenes
712 // Tell the physics engines that this prim changed. 714 // Tell the physics engines that this prim changed.
713 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor); 715 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
714 } 716 }
717
718 List<ScenePresence> avs = ParentGroup.GetLinkedAvatars();
719 foreach (ScenePresence av in avs)
720 {
721 av.SendFullUpdateToAllClients();
722 }
715 } 723 }
716 } 724 }
717 } 725 }
@@ -754,7 +762,7 @@ namespace OpenSim.Region.Framework.Scenes
754 762
755 set 763 set
756 { 764 {
757 StoreUndoState(); 765 StoreUndoState(UndoType.STATE_PRIM_ROTATION);
758 m_rotationOffset = value; 766 m_rotationOffset = value;
759 767
760 PhysicsActor actor = PhysActor; 768 PhysicsActor actor = PhysActor;
@@ -838,7 +846,16 @@ namespace OpenSim.Region.Framework.Scenes
838 /// <summary></summary> 846 /// <summary></summary>
839 public Vector3 Acceleration 847 public Vector3 Acceleration
840 { 848 {
841 get { return m_acceleration; } 849 get
850 {
851 PhysicsActor actor = PhysActor;
852 if (actor != null)
853 {
854 m_acceleration = actor.Acceleration;
855 }
856 return m_acceleration;
857 }
858
842 set { m_acceleration = value; } 859 set { m_acceleration = value; }
843 } 860 }
844 861
@@ -944,7 +961,7 @@ namespace OpenSim.Region.Framework.Scenes
944 get { return m_shape.Scale; } 961 get { return m_shape.Scale; }
945 set 962 set
946 { 963 {
947 StoreUndoState(); 964 StoreUndoState(UndoType.STATE_PRIM_SCALE);
948 if (m_shape != null) 965 if (m_shape != null)
949 { 966 {
950 m_shape.Scale = value; 967 m_shape.Scale = value;
@@ -989,7 +1006,8 @@ namespace OpenSim.Region.Framework.Scenes
989 if (IsAttachment) 1006 if (IsAttachment)
990 return GroupPosition; 1007 return GroupPosition;
991 1008
992 return m_offsetPosition + m_groupPosition; } 1009// return m_offsetPosition + m_groupPosition; }
1010 return m_groupPosition + (m_offsetPosition * ParentGroup.RootPart.RotationOffset) ; } //KF: Rotation was ignored!
993 } 1011 }
994 1012
995 public SceneObjectGroup ParentGroup 1013 public SceneObjectGroup ParentGroup
@@ -1140,6 +1158,13 @@ namespace OpenSim.Region.Framework.Scenes
1140 get { return _flags; } 1158 get { return _flags; }
1141 set { _flags = value; } 1159 set { _flags = value; }
1142 } 1160 }
1161
1162 [XmlIgnore]
1163 public bool IsOccupied // KF If an av is sittingon this prim
1164 {
1165 get { return m_occupied; }
1166 set { m_occupied = value; }
1167 }
1143 1168
1144 [XmlIgnore] 1169 [XmlIgnore]
1145 public UUID SitTargetAvatar 1170 public UUID SitTargetAvatar
@@ -1215,14 +1240,6 @@ namespace OpenSim.Region.Framework.Scenes
1215 } 1240 }
1216 } 1241 }
1217 1242
1218 /// <summary>
1219 /// Clear all pending updates of parts to clients
1220 /// </summary>
1221 private void ClearUpdateSchedule()
1222 {
1223 m_updateFlag = 0;
1224 }
1225
1226 private void SendObjectPropertiesToClient(UUID AgentID) 1243 private void SendObjectPropertiesToClient(UUID AgentID)
1227 { 1244 {
1228 m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence avatar) 1245 m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence avatar)
@@ -1508,7 +1525,7 @@ namespace OpenSim.Region.Framework.Scenes
1508 { 1525 {
1509 m_redo.Clear(); 1526 m_redo.Clear();
1510 } 1527 }
1511 StoreUndoState(); 1528 StoreUndoState(UndoType.STATE_ALL);
1512 } 1529 }
1513 1530
1514 public byte ConvertScriptUintToByte(uint indata) 1531 public byte ConvertScriptUintToByte(uint indata)
@@ -1611,7 +1628,7 @@ namespace OpenSim.Region.Framework.Scenes
1611 PrimitiveBaseShape shape = PrimitiveBaseShape.Create(); 1628 PrimitiveBaseShape shape = PrimitiveBaseShape.Create();
1612 part.Shape = shape; 1629 part.Shape = shape;
1613 1630
1614 part.Name = "Primitive"; 1631 part.Name = "Object";
1615 part._ownerID = UUID.Random(); 1632 part._ownerID = UUID.Random();
1616 1633
1617 return part; 1634 return part;
@@ -1734,7 +1751,7 @@ namespace OpenSim.Region.Framework.Scenes
1734 // which stops client-side interpolation of deactivated joint proxy objects. 1751 // which stops client-side interpolation of deactivated joint proxy objects.
1735 } 1752 }
1736 1753
1737 if (!UsePhysics && !isNew) 1754 if (!UsePhysics)
1738 { 1755 {
1739 // reset velocity to 0 on physics switch-off. Without that, the client thinks the 1756 // reset velocity to 0 on physics switch-off. Without that, the client thinks the
1740 // prim still has velocity and continues to interpolate its position along the old 1757 // prim still has velocity and continues to interpolate its position along the old
@@ -1969,12 +1986,17 @@ namespace OpenSim.Region.Framework.Scenes
1969 public Vector3 GetWorldPosition() 1986 public Vector3 GetWorldPosition()
1970 { 1987 {
1971 Quaternion parentRot = ParentGroup.RootPart.RotationOffset; 1988 Quaternion parentRot = ParentGroup.RootPart.RotationOffset;
1972
1973 Vector3 axPos = OffsetPosition; 1989 Vector3 axPos = OffsetPosition;
1974
1975 axPos *= parentRot; 1990 axPos *= parentRot;
1976 Vector3 translationOffsetPosition = axPos; 1991 Vector3 translationOffsetPosition = axPos;
1977 return GroupPosition + translationOffsetPosition; 1992 if(_parentID == 0)
1993 {
1994 return GroupPosition;
1995 }
1996 else
1997 {
1998 return ParentGroup.AbsolutePosition + translationOffsetPosition; //KF: Fix child prim position
1999 }
1978 } 2000 }
1979 2001
1980 /// <summary> 2002 /// <summary>
@@ -1985,7 +2007,7 @@ namespace OpenSim.Region.Framework.Scenes
1985 { 2007 {
1986 Quaternion newRot; 2008 Quaternion newRot;
1987 2009
1988 if (this.LinkNum == 0) 2010 if (this.LinkNum < 2) //KF Single or root prim
1989 { 2011 {
1990 newRot = RotationOffset; 2012 newRot = RotationOffset;
1991 } 2013 }
@@ -2631,17 +2653,18 @@ namespace OpenSim.Region.Framework.Scenes
2631 //Trys to fetch sound id from prim's inventory. 2653 //Trys to fetch sound id from prim's inventory.
2632 //Prim's inventory doesn't support non script items yet 2654 //Prim's inventory doesn't support non script items yet
2633 2655
2634 lock (TaskInventory) 2656 TaskInventory.LockItemsForRead(true);
2657
2658 foreach (KeyValuePair<UUID, TaskInventoryItem> item in TaskInventory)
2635 { 2659 {
2636 foreach (KeyValuePair<UUID, TaskInventoryItem> item in TaskInventory) 2660 if (item.Value.Name == sound)
2637 { 2661 {
2638 if (item.Value.Name == sound) 2662 soundID = item.Value.ItemID;
2639 { 2663 break;
2640 soundID = item.Value.ItemID;
2641 break;
2642 }
2643 } 2664 }
2644 } 2665 }
2666
2667 TaskInventory.LockItemsForRead(false);
2645 } 2668 }
2646 2669
2647 m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence sp) 2670 m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence sp)
@@ -2701,7 +2724,7 @@ namespace OpenSim.Region.Framework.Scenes
2701 /// <param name="scale"></param> 2724 /// <param name="scale"></param>
2702 public void Resize(Vector3 scale) 2725 public void Resize(Vector3 scale)
2703 { 2726 {
2704 StoreUndoState(); 2727 StoreUndoState(UndoType.STATE_PRIM_SCALE);
2705 m_shape.Scale = scale; 2728 m_shape.Scale = scale;
2706 2729
2707 ParentGroup.HasGroupChanged = true; 2730 ParentGroup.HasGroupChanged = true;
@@ -2710,38 +2733,7 @@ namespace OpenSim.Region.Framework.Scenes
2710 2733
2711 public void RotLookAt(Quaternion target, float strength, float damping) 2734 public void RotLookAt(Quaternion target, float strength, float damping)
2712 { 2735 {
2713 rotLookAt(target, strength, damping); 2736 m_parentGroup.rotLookAt(target, strength, damping); // This calls method in SceneObjectGroup.
2714 }
2715
2716 public void rotLookAt(Quaternion target, float strength, float damping)
2717 {
2718 if (IsAttachment)
2719 {
2720 /*
2721 ScenePresence avatar = m_scene.GetScenePresence(rootpart.AttachedAvatar);
2722 if (avatar != null)
2723 {
2724 Rotate the Av?
2725 } */
2726 }
2727 else
2728 {
2729 APIDDamp = damping;
2730 APIDStrength = strength;
2731 APIDTarget = target;
2732 }
2733 }
2734
2735 public void startLookAt(Quaternion rot, float damp, float strength)
2736 {
2737 APIDDamp = damp;
2738 APIDStrength = strength;
2739 APIDTarget = rot;
2740 }
2741
2742 public void stopLookAt()
2743 {
2744 APIDTarget = Quaternion.Identity;
2745 } 2737 }
2746 2738
2747 /// <summary> 2739 /// <summary>
@@ -2753,7 +2745,10 @@ namespace OpenSim.Region.Framework.Scenes
2753 2745
2754 if (m_parentGroup != null) 2746 if (m_parentGroup != null)
2755 { 2747 {
2756 m_parentGroup.QueueForUpdateCheck(); 2748 if (!m_parentGroup.areUpdatesSuspended)
2749 {
2750 m_parentGroup.QueueForUpdateCheck();
2751 }
2757 } 2752 }
2758 2753
2759 int timeNow = Util.UnixTimeSinceEpoch(); 2754 int timeNow = Util.UnixTimeSinceEpoch();
@@ -2970,8 +2965,8 @@ namespace OpenSim.Region.Framework.Scenes
2970 { 2965 {
2971 const float ROTATION_TOLERANCE = 0.01f; 2966 const float ROTATION_TOLERANCE = 0.01f;
2972 const float VELOCITY_TOLERANCE = 0.001f; 2967 const float VELOCITY_TOLERANCE = 0.001f;
2973 const float POSITION_TOLERANCE = 0.05f; 2968 const float POSITION_TOLERANCE = 0.05f; // I don't like this, but I suppose it's necessary
2974 const int TIME_MS_TOLERANCE = 3000; 2969 const int TIME_MS_TOLERANCE = 200; //llSetPos has a 200ms delay. This should NOT be 3 seconds.
2975 2970
2976 if (m_updateFlag == 1) 2971 if (m_updateFlag == 1)
2977 { 2972 {
@@ -2985,7 +2980,7 @@ namespace OpenSim.Region.Framework.Scenes
2985 Environment.TickCount - m_lastTerseSent > TIME_MS_TOLERANCE) 2980 Environment.TickCount - m_lastTerseSent > TIME_MS_TOLERANCE)
2986 { 2981 {
2987 AddTerseUpdateToAllAvatars(); 2982 AddTerseUpdateToAllAvatars();
2988 ClearUpdateSchedule(); 2983
2989 2984
2990 // This causes the Scene to 'poll' physical objects every couple of frames 2985 // This causes the Scene to 'poll' physical objects every couple of frames
2991 // bad, so it's been replaced by an event driven method. 2986 // bad, so it's been replaced by an event driven method.
@@ -3003,16 +2998,18 @@ namespace OpenSim.Region.Framework.Scenes
3003 m_lastAngularVelocity = AngularVelocity; 2998 m_lastAngularVelocity = AngularVelocity;
3004 m_lastTerseSent = Environment.TickCount; 2999 m_lastTerseSent = Environment.TickCount;
3005 } 3000 }
3001 //Moved this outside of the if clause so updates don't get blocked.. *sigh*
3002 m_updateFlag = 0; //Why were we calling a function to do this? Inefficient! *screams*
3006 } 3003 }
3007 else 3004 else
3008 { 3005 {
3009 if (m_updateFlag == 2) // is a new prim, just created/reloaded or has major changes 3006 if (m_updateFlag == 2) // is a new prim, just created/reloaded or has major changes
3010 { 3007 {
3011 AddFullUpdateToAllAvatars(); 3008 AddFullUpdateToAllAvatars();
3012 ClearUpdateSchedule(); 3009 m_updateFlag = 0; //Same here
3013 } 3010 }
3014 } 3011 }
3015 ClearUpdateSchedule(); 3012 m_updateFlag = 0;
3016 } 3013 }
3017 3014
3018 /// <summary> 3015 /// <summary>
@@ -3039,17 +3036,16 @@ namespace OpenSim.Region.Framework.Scenes
3039 if (!UUID.TryParse(sound, out soundID)) 3036 if (!UUID.TryParse(sound, out soundID))
3040 { 3037 {
3041 // search sound file from inventory 3038 // search sound file from inventory
3042 lock (TaskInventory) 3039 TaskInventory.LockItemsForRead(true);
3040 foreach (KeyValuePair<UUID, TaskInventoryItem> item in TaskInventory)
3043 { 3041 {
3044 foreach (KeyValuePair<UUID, TaskInventoryItem> item in TaskInventory) 3042 if (item.Value.Name == sound && item.Value.Type == (int)AssetType.Sound)
3045 { 3043 {
3046 if (item.Value.Name == sound && item.Value.Type == (int)AssetType.Sound) 3044 soundID = item.Value.ItemID;
3047 { 3045 break;
3048 soundID = item.Value.ItemID;
3049 break;
3050 }
3051 } 3046 }
3052 } 3047 }
3048 TaskInventory.LockItemsForRead(false);
3053 } 3049 }
3054 3050
3055 if (soundID == UUID.Zero) 3051 if (soundID == UUID.Zero)
@@ -3484,7 +3480,7 @@ namespace OpenSim.Region.Framework.Scenes
3484 3480
3485 public void StopLookAt() 3481 public void StopLookAt()
3486 { 3482 {
3487 m_parentGroup.stopLookAt(); 3483 m_parentGroup.stopLookAt(); // This calls method in SceneObjectGroup.
3488 3484
3489 m_parentGroup.ScheduleGroupForTerseUpdate(); 3485 m_parentGroup.ScheduleGroupForTerseUpdate();
3490 } 3486 }
@@ -3511,10 +3507,9 @@ namespace OpenSim.Region.Framework.Scenes
3511 m_parentGroup.ScheduleGroupForTerseUpdate(); 3507 m_parentGroup.ScheduleGroupForTerseUpdate();
3512 //m_parentGroup.ScheduleGroupForFullUpdate(); 3508 //m_parentGroup.ScheduleGroupForFullUpdate();
3513 } 3509 }
3514 3510 public void StoreUndoState(UndoType type)
3515 public void StoreUndoState()
3516 { 3511 {
3517 if (!Undoing) 3512 if (!Undoing && (m_parentGroup == null || m_parentGroup.RootPart == null || !m_parentGroup.RootPart.Undoing))
3518 { 3513 {
3519 if (!IgnoreUndoUpdate) 3514 if (!IgnoreUndoUpdate)
3520 { 3515 {
@@ -3525,17 +3520,25 @@ namespace OpenSim.Region.Framework.Scenes
3525 if (m_undo.Count > 0) 3520 if (m_undo.Count > 0)
3526 { 3521 {
3527 UndoState last = m_undo.Peek(); 3522 UndoState last = m_undo.Peek();
3528 if (last != null) 3523
3529 {
3530 if (last.Compare(this))
3531 return;
3532 }
3533 } 3524 }
3534 3525
3535 if (m_parentGroup.GetSceneMaxUndo() > 0) 3526 if (m_parentGroup.GetSceneMaxUndo() > 0)
3536 { 3527 {
3537 UndoState nUndo = new UndoState(this); 3528 UndoState lastUndo = m_undo.Peek();
3538 3529
3530 UndoState nUndo = new UndoState(this, type);
3531
3532 if (lastUndo != null)
3533 {
3534 TimeSpan ts = DateTime.Now.Subtract(lastUndo.LastUpdated);
3535 if (ts.TotalMilliseconds < 500)
3536 {
3537 //Delete the last entry since it was less than 500 milliseconds ago
3538 nUndo.Merge(lastUndo);
3539 m_undo.Pop();
3540 }
3541 }
3539 m_undo.Push(nUndo); 3542 m_undo.Push(nUndo);
3540 } 3543 }
3541 3544
@@ -4012,11 +4015,13 @@ namespace OpenSim.Region.Framework.Scenes
4012 if (m_undo.Count > 0) 4015 if (m_undo.Count > 0)
4013 { 4016 {
4014 UndoState nUndo = null; 4017 UndoState nUndo = null;
4018 UndoState goback = m_undo.Pop();
4015 if (m_parentGroup.GetSceneMaxUndo() > 0) 4019 if (m_parentGroup.GetSceneMaxUndo() > 0)
4016 { 4020 {
4017 nUndo = new UndoState(this); 4021 nUndo = new UndoState(this, goback.Type);
4018 } 4022 }
4019 UndoState goback = m_undo.Pop(); 4023
4024
4020 if (goback != null) 4025 if (goback != null)
4021 { 4026 {
4022 goback.PlaybackState(this); 4027 goback.PlaybackState(this);
@@ -4031,13 +4036,13 @@ namespace OpenSim.Region.Framework.Scenes
4031 { 4036 {
4032 lock (m_redo) 4037 lock (m_redo)
4033 { 4038 {
4039 UndoState gofwd = m_redo.Pop();
4034 if (m_parentGroup.GetSceneMaxUndo() > 0) 4040 if (m_parentGroup.GetSceneMaxUndo() > 0)
4035 { 4041 {
4036 UndoState nUndo = new UndoState(this); 4042 UndoState nUndo = new UndoState(this, gofwd.Type);
4037 4043
4038 m_undo.Push(nUndo); 4044 m_undo.Push(nUndo);
4039 } 4045 }
4040 UndoState gofwd = m_redo.Pop();
4041 if (gofwd != null) 4046 if (gofwd != null)
4042 gofwd.PlayfwdState(this); 4047 gofwd.PlayfwdState(this);
4043 } 4048 }
@@ -4478,8 +4483,9 @@ namespace OpenSim.Region.Framework.Scenes
4478 { 4483 {
4479 m_shape.TextureEntry = textureEntry; 4484 m_shape.TextureEntry = textureEntry;
4480 TriggerScriptChangedEvent(Changed.TEXTURE); 4485 TriggerScriptChangedEvent(Changed.TEXTURE);
4481 4486 m_updateFlag = 1;
4482 ParentGroup.HasGroupChanged = true; 4487 ParentGroup.HasGroupChanged = true;
4488
4483 //This is madness.. 4489 //This is madness..
4484 //ParentGroup.ScheduleGroupForFullUpdate(); 4490 //ParentGroup.ScheduleGroupForFullUpdate();
4485 //This is sparta 4491 //This is sparta
@@ -4724,5 +4730,17 @@ namespace OpenSim.Region.Framework.Scenes
4724 Color color = Color; 4730 Color color = Color;
4725 return new Color4(color.R, color.G, color.B, (byte)(0xFF - color.A)); 4731 return new Color4(color.R, color.G, color.B, (byte)(0xFF - color.A));
4726 } 4732 }
4733
4734 public void ResetOwnerChangeFlag()
4735 {
4736 List<UUID> inv = Inventory.GetInventoryList();
4737
4738 foreach (UUID itemID in inv)
4739 {
4740 TaskInventoryItem item = Inventory.GetInventoryItem(itemID);
4741 item.OwnerChanged = false;
4742 Inventory.UpdateInventoryItem(item);
4743 }
4744 }
4727 } 4745 }
4728} 4746}