diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SceneObjectPart.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 230 |
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 | } |