mirror of
https://github.com/opensim/opensim.git
synced 2026-08-06 17:32:42 +08:00
Change the way attachments are persisted. Editing a worn attachment will now
save properly, as will the results of a resizer script working. Attachment positions are no longer saved on each move, but instead are saved once on logout. Attachment script states are saved as part of the attachment now when detaching.
This commit is contained in:
@@ -122,11 +122,20 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||
void ShowDetachInUserInventory(UUID itemID, IClientAPI remoteClient);
|
||||
|
||||
/// <summary>
|
||||
/// Update the position of an attachment
|
||||
/// Update the user inventory with a changed attachment
|
||||
/// </summary>
|
||||
/// <param name="client"></param>
|
||||
/// <param name="sog"></param>
|
||||
/// <param name="pos"></param>
|
||||
void UpdateAttachmentPosition(IClientAPI client, SceneObjectGroup sog, Vector3 pos);
|
||||
/// <param name="remoteClient">
|
||||
/// A <see cref="IClientAPI"/>
|
||||
/// </param>
|
||||
/// <param name="grp">
|
||||
/// A <see cref="SceneObjectGroup"/>
|
||||
/// </param>
|
||||
/// <param name="itemID">
|
||||
/// A <see cref="UUID"/>
|
||||
/// </param>
|
||||
/// <param name="agentID">
|
||||
/// A <see cref="UUID"/>
|
||||
/// </param>
|
||||
void UpdateKnownItem(IClientAPI remoteClient, SceneObjectGroup grp, UUID itemID, UUID agentID);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -183,6 +183,7 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||
/// <returns>false if the item did not exist, true if the update occurred successfully</returns>
|
||||
bool UpdateInventoryItem(TaskInventoryItem item);
|
||||
bool UpdateInventoryItem(TaskInventoryItem item, bool fireScriptEvents);
|
||||
bool UpdateInventoryItem(TaskInventoryItem item, bool fireScriptEvents, bool considerChanged);
|
||||
|
||||
/// <summary>
|
||||
/// Remove an item from this entity's inventory
|
||||
|
||||
@@ -3152,7 +3152,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
List<ulong> regions = new List<ulong>(avatar.KnownChildRegionHandles);
|
||||
regions.Remove(RegionInfo.RegionHandle);
|
||||
m_sceneGridService.SendCloseChildAgentConnections(agentID, regions);
|
||||
|
||||
}
|
||||
m_eventManager.TriggerClientClosed(agentID, this);
|
||||
}
|
||||
@@ -3164,6 +3163,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
|
||||
m_eventManager.TriggerOnRemovePresence(agentID);
|
||||
|
||||
if (avatar != null && (!avatar.IsChildAgent))
|
||||
avatar.SaveChangedAttachments();
|
||||
|
||||
ForEachClient(
|
||||
delegate(IClientAPI client)
|
||||
{
|
||||
|
||||
@@ -259,7 +259,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
protected internal bool AddRestoredSceneObject(
|
||||
SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted, bool sendClientUpdates)
|
||||
{
|
||||
if (!alreadyPersisted)
|
||||
if (attachToBackup && (!alreadyPersisted))
|
||||
{
|
||||
sceneObject.ForceInventoryPersistence();
|
||||
sceneObject.HasGroupChanged = true;
|
||||
@@ -282,8 +282,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
/// </returns>
|
||||
protected internal bool AddNewSceneObject(SceneObjectGroup sceneObject, bool attachToBackup, bool sendClientUpdates)
|
||||
{
|
||||
// Ensure that we persist this new scene object
|
||||
sceneObject.HasGroupChanged = true;
|
||||
// Ensure that we persist this new scene object if it's not an
|
||||
// attachment
|
||||
if (attachToBackup)
|
||||
sceneObject.HasGroupChanged = true;
|
||||
|
||||
return AddSceneObject(sceneObject, attachToBackup, sendClientUpdates);
|
||||
}
|
||||
@@ -1279,8 +1281,13 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
{
|
||||
if (group.IsAttachment || (group.RootPart.Shape.PCode == 9 && group.RootPart.Shape.State != 0))
|
||||
{
|
||||
if (m_parentScene.AttachmentsModule != null)
|
||||
m_parentScene.AttachmentsModule.UpdateAttachmentPosition(remoteClient, group, pos);
|
||||
// Set the new attachment point data in the object
|
||||
byte attachmentPoint = group.GetAttachmentPoint();
|
||||
group.UpdateGroupPosition(pos);
|
||||
group.RootPart.IsAttachment = false;
|
||||
group.AbsolutePosition = group.RootPart.AttachedPos;
|
||||
group.SetAttachmentPoint(attachmentPoint);
|
||||
group.HasGroupChanged = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -491,13 +491,15 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
XmlNodeList nodes = doc.GetElementsByTagName("SavedScriptState");
|
||||
if (nodes.Count > 0)
|
||||
{
|
||||
m_savedScriptState = new Dictionary<UUID, string>();
|
||||
if (m_savedScriptState == null)
|
||||
m_savedScriptState = new Dictionary<UUID, string>();
|
||||
foreach (XmlNode node in nodes)
|
||||
{
|
||||
if (node.Attributes["UUID"] != null)
|
||||
{
|
||||
UUID itemid = new UUID(node.Attributes["UUID"].Value);
|
||||
m_savedScriptState.Add(itemid, node.InnerXml);
|
||||
if (itemid != UUID.Zero)
|
||||
m_savedScriptState[itemid] = node.InnerXml;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -127,8 +127,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
if (0 == m_items.Count)
|
||||
return;
|
||||
|
||||
HasInventoryChanged = true;
|
||||
m_part.ParentGroup.HasGroupChanged = true;
|
||||
IList<TaskInventoryItem> items = GetInventoryItems();
|
||||
m_items.Clear();
|
||||
|
||||
@@ -144,17 +142,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
{
|
||||
lock (Items)
|
||||
{
|
||||
if (Items.Count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
HasInventoryChanged = true;
|
||||
if (m_part.ParentGroup != null)
|
||||
{
|
||||
m_part.ParentGroup.HasGroupChanged = true;
|
||||
}
|
||||
|
||||
IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values);
|
||||
Items.Clear();
|
||||
|
||||
@@ -208,8 +195,15 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
}
|
||||
}
|
||||
|
||||
HasInventoryChanged = true;
|
||||
m_part.ParentGroup.HasGroupChanged = true;
|
||||
// Don't let this set the HasGroupChanged flag for attachments
|
||||
// as this happens during rez and we don't want a new asset
|
||||
// for each attachment each time
|
||||
if (!m_part.ParentGroup.RootPart.IsAttachment)
|
||||
{
|
||||
HasInventoryChanged = true;
|
||||
m_part.ParentGroup.HasGroupChanged = true;
|
||||
}
|
||||
|
||||
List<TaskInventoryItem> items = GetInventoryItems();
|
||||
foreach (TaskInventoryItem item in items)
|
||||
{
|
||||
@@ -674,13 +668,19 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
/// <returns>false if the item did not exist, true if the update occurred successfully</returns>
|
||||
public bool UpdateInventoryItem(TaskInventoryItem item)
|
||||
{
|
||||
return UpdateInventoryItem(item, true);
|
||||
return UpdateInventoryItem(item, true, true);
|
||||
}
|
||||
|
||||
public bool UpdateInventoryItem(TaskInventoryItem item, bool fireScriptEvents)
|
||||
{
|
||||
return UpdateInventoryItem(item, fireScriptEvents, true);
|
||||
}
|
||||
|
||||
public bool UpdateInventoryItem(TaskInventoryItem item, bool fireScriptEvents, bool considerChanged)
|
||||
{
|
||||
TaskInventoryItem it = GetInventoryItem(item.ItemID);
|
||||
if (it != null)
|
||||
|
||||
{
|
||||
item.ParentID = m_part.UUID;
|
||||
item.ParentPartID = m_part.UUID;
|
||||
@@ -702,9 +702,11 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
|
||||
if (fireScriptEvents)
|
||||
m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
|
||||
|
||||
HasInventoryChanged = true;
|
||||
m_part.ParentGroup.HasGroupChanged = true;
|
||||
if (considerChanged)
|
||||
{
|
||||
HasInventoryChanged = true;
|
||||
m_part.ParentGroup.HasGroupChanged = true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else
|
||||
|
||||
@@ -3746,5 +3746,25 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
m_reprioritization_called = false;
|
||||
}
|
||||
}
|
||||
|
||||
public void SaveChangedAttachments()
|
||||
{
|
||||
// Need to copy this list because DetachToInventoryPrep mods it
|
||||
List<SceneObjectGroup> attachments = new List<SceneObjectGroup>(Attachments.ToArray());
|
||||
|
||||
IAttachmentsModule attachmentsModule = m_scene.AttachmentsModule;
|
||||
if (attachmentsModule != null)
|
||||
{
|
||||
foreach (SceneObjectGroup grp in attachments)
|
||||
{
|
||||
if (grp.HasGroupChanged) // Resizer scripts?
|
||||
{
|
||||
grp.DetachToInventoryPrep();
|
||||
attachmentsModule.UpdateKnownItem(ControllingClient,
|
||||
grp, grp.GetFromItemID(), grp.OwnerID);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user