diff options
author | Justin Clark-Casey (justincc) | 2010-03-03 22:14:06 +0000 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2010-03-03 22:14:06 +0000 |
commit | edb176447ba9cd6d29bd45d9b3714aa0dab9cbf9 (patch) | |
tree | 5cd33ef765c28d2265b4e119f78ca5a1104ca590 /OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | |
parent | Actually make EventManager.OnAttach() fire when an object is attached. Previ... (diff) | |
download | opensim-SC-edb176447ba9cd6d29bd45d9b3714aa0dab9cbf9.zip opensim-SC-edb176447ba9cd6d29bd45d9b3714aa0dab9cbf9.tar.gz opensim-SC-edb176447ba9cd6d29bd45d9b3714aa0dab9cbf9.tar.bz2 opensim-SC-edb176447ba9cd6d29bd45d9b3714aa0dab9cbf9.tar.xz |
Fix bug where approximately half the time, attachments would rez only their root prim until right clicked (or otherwise updated).
The root cause of this problem was that multiple ObjectUpdates were being sent on attachment which differed enough to confuse the client.
Sometimes these would eliminate each other and sometimes not, depending on whether the scheduler looked at the queued updates.
The solution here is to only schedule the ObjectUpdate once the attachment code has done all it needs to do.
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/Scene.Inventory.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 44 |
1 files changed, 37 insertions, 7 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 6df25d6..5f3cd8c 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | |||
@@ -1842,9 +1842,18 @@ namespace OpenSim.Region.Framework.Scenes | |||
1842 | EventManager.TriggerOnAttach(localID, itemID, avatarID); | 1842 | EventManager.TriggerOnAttach(localID, itemID, avatarID); |
1843 | } | 1843 | } |
1844 | 1844 | ||
1845 | public UUID RezSingleAttachment(IClientAPI remoteClient, UUID itemID, | 1845 | /// <summary> |
1846 | uint AttachmentPt) | 1846 | /// Called when the client receives a request to rez a single attachment on to the avatar from inventory |
1847 | /// (RezSingleAttachmentFromInv packet). | ||
1848 | /// </summary> | ||
1849 | /// <param name="remoteClient"></param> | ||
1850 | /// <param name="itemID"></param> | ||
1851 | /// <param name="AttachmentPt"></param> | ||
1852 | /// <returns></returns> | ||
1853 | public UUID RezSingleAttachment(IClientAPI remoteClient, UUID itemID, uint AttachmentPt) | ||
1847 | { | 1854 | { |
1855 | m_log.DebugFormat("[USER INVENTORY]: Rezzing single attachment from item {0} for {1}", itemID, remoteClient.Name); | ||
1856 | |||
1848 | SceneObjectGroup att = m_sceneGraph.RezSingleAttachment(remoteClient, itemID, AttachmentPt); | 1857 | SceneObjectGroup att = m_sceneGraph.RezSingleAttachment(remoteClient, itemID, AttachmentPt); |
1849 | 1858 | ||
1850 | if (att == null) | 1859 | if (att == null) |
@@ -1856,9 +1865,20 @@ namespace OpenSim.Region.Framework.Scenes | |||
1856 | return RezSingleAttachment(att, remoteClient, itemID, AttachmentPt); | 1865 | return RezSingleAttachment(att, remoteClient, itemID, AttachmentPt); |
1857 | } | 1866 | } |
1858 | 1867 | ||
1859 | public UUID RezSingleAttachment(SceneObjectGroup att, | 1868 | /// <summary> |
1860 | IClientAPI remoteClient, UUID itemID, uint AttachmentPt) | 1869 | /// Update the user inventory to reflect an attachment |
1870 | /// </summary> | ||
1871 | /// <param name="att"></param> | ||
1872 | /// <param name="remoteClient"></param> | ||
1873 | /// <param name="itemID"></param> | ||
1874 | /// <param name="AttachmentPt"></param> | ||
1875 | /// <returns></returns> | ||
1876 | public UUID RezSingleAttachment(SceneObjectGroup att, IClientAPI remoteClient, UUID itemID, uint AttachmentPt) | ||
1861 | { | 1877 | { |
1878 | m_log.DebugFormat( | ||
1879 | "[USER INVENTORY]: Updating inventory of {0} to show attachment of {1} (item ID {2})", | ||
1880 | remoteClient.Name, att.Name, itemID); | ||
1881 | |||
1862 | if (!att.IsDeleted) | 1882 | if (!att.IsDeleted) |
1863 | AttachmentPt = att.RootPart.AttachmentPoint; | 1883 | AttachmentPt = att.RootPart.AttachmentPoint; |
1864 | 1884 | ||
@@ -1897,8 +1917,19 @@ namespace OpenSim.Region.Framework.Scenes | |||
1897 | return m_sceneGraph.AttachObject(controllingClient, localID, attachPoint, rot, pos, silent); | 1917 | return m_sceneGraph.AttachObject(controllingClient, localID, attachPoint, rot, pos, silent); |
1898 | } | 1918 | } |
1899 | 1919 | ||
1920 | /// <summary> | ||
1921 | /// This registers the item as attached in a user's inventory | ||
1922 | /// </summary> | ||
1923 | /// <param name="remoteClient"></param> | ||
1924 | /// <param name="AttachmentPt"></param> | ||
1925 | /// <param name="itemID"></param> | ||
1926 | /// <param name="att"></param> | ||
1900 | public void AttachObject(IClientAPI remoteClient, uint AttachmentPt, UUID itemID, SceneObjectGroup att) | 1927 | public void AttachObject(IClientAPI remoteClient, uint AttachmentPt, UUID itemID, SceneObjectGroup att) |
1901 | { | 1928 | { |
1929 | // m_log.DebugFormat( | ||
1930 | // "[USER INVENTORY]: Updating attachment {0} for {1} at {2} using item ID {3}", | ||
1931 | // att.Name, remoteClient.Name, AttachmentPt, itemID); | ||
1932 | |||
1902 | if (UUID.Zero == itemID) | 1933 | if (UUID.Zero == itemID) |
1903 | { | 1934 | { |
1904 | m_log.Error("[SCENE INVENTORY]: Unable to save attachment. Error inventory item ID."); | 1935 | m_log.Error("[SCENE INVENTORY]: Unable to save attachment. Error inventory item ID."); |
@@ -1926,10 +1957,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1926 | presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /* att.UUID */); | 1957 | presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /* att.UUID */); |
1927 | 1958 | ||
1928 | if (m_AvatarFactory != null) | 1959 | if (m_AvatarFactory != null) |
1929 | { | ||
1930 | m_AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance); | 1960 | m_AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance); |
1931 | } | ||
1932 | |||
1933 | } | 1961 | } |
1934 | } | 1962 | } |
1935 | 1963 | ||
@@ -2012,6 +2040,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2012 | { | 2040 | { |
2013 | sog.SetOwnerId(ownerID); | 2041 | sog.SetOwnerId(ownerID); |
2014 | sog.SetGroup(groupID, remoteClient); | 2042 | sog.SetGroup(groupID, remoteClient); |
2043 | sog.ScheduleGroupForFullUpdate(); | ||
2015 | 2044 | ||
2016 | foreach (SceneObjectPart child in sog.Children.Values) | 2045 | foreach (SceneObjectPart child in sog.Children.Values) |
2017 | child.Inventory.ChangeInventoryOwner(ownerID); | 2046 | child.Inventory.ChangeInventoryOwner(ownerID); |
@@ -2033,6 +2062,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2033 | sog.SetOwnerId(groupID); | 2062 | sog.SetOwnerId(groupID); |
2034 | sog.ApplyNextOwnerPermissions(); | 2063 | sog.ApplyNextOwnerPermissions(); |
2035 | } | 2064 | } |
2065 | |||
2036 | } | 2066 | } |
2037 | 2067 | ||
2038 | foreach (uint localID in localIDs) | 2068 | foreach (uint localID in localIDs) |