If an object has it's temporary flag unset after being set, put it back in the persistence list.

Effectively uses the patch in http://opensimulator.org/mantis/view.php?id=7060
But also adds a regression test and exposes the necessary property to allow this to work.
0.8.0.3
Justin Clark-Casey (justincc) 2014-03-22 00:29:13 +00:00
parent 178a5a5585
commit a5800f479e
2 changed files with 44 additions and 12 deletions

View File

@ -272,7 +272,10 @@ namespace OpenSim.Region.Framework.Scenes
private Vector3 lastPhysGroupPos; private Vector3 lastPhysGroupPos;
private Quaternion lastPhysGroupRot; private Quaternion lastPhysGroupRot;
private bool m_isBackedUp; /// <summary>
/// Is this entity set to be saved in persistent storage?
/// </summary>
public bool Backup { get; private set; }
protected MapAndArray<UUID, SceneObjectPart> m_parts = new MapAndArray<UUID, SceneObjectPart>(); protected MapAndArray<UUID, SceneObjectPart> m_parts = new MapAndArray<UUID, SceneObjectPart>();
@ -882,10 +885,10 @@ namespace OpenSim.Region.Framework.Scenes
//m_log.DebugFormat( //m_log.DebugFormat(
// "[SCENE OBJECT GROUP]: Attaching object {0} {1} to scene presistence sweep", Name, UUID); // "[SCENE OBJECT GROUP]: Attaching object {0} {1} to scene presistence sweep", Name, UUID);
if (!m_isBackedUp) if (!Backup)
m_scene.EventManager.OnBackup += ProcessBackup; m_scene.EventManager.OnBackup += ProcessBackup;
m_isBackedUp = true; Backup = true;
} }
} }
@ -1555,7 +1558,7 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="datastore"></param> /// <param name="datastore"></param>
public virtual void ProcessBackup(ISimulationDataService datastore, bool forcedBackup) public virtual void ProcessBackup(ISimulationDataService datastore, bool forcedBackup)
{ {
if (!m_isBackedUp) if (!Backup)
{ {
// m_log.DebugFormat( // m_log.DebugFormat(
// "[WATER WARS]: Ignoring backup of {0} {1} since object is not marked to be backed up", Name, UUID); // "[WATER WARS]: Ignoring backup of {0} {1} since object is not marked to be backed up", Name, UUID);
@ -1677,7 +1680,7 @@ namespace OpenSim.Region.Framework.Scenes
public SceneObjectGroup Copy(bool userExposed) public SceneObjectGroup Copy(bool userExposed)
{ {
SceneObjectGroup dupe = (SceneObjectGroup)MemberwiseClone(); SceneObjectGroup dupe = (SceneObjectGroup)MemberwiseClone();
dupe.m_isBackedUp = false; dupe.Backup = false;
dupe.m_parts = new MapAndArray<OpenMetaverse.UUID, SceneObjectPart>(); dupe.m_parts = new MapAndArray<OpenMetaverse.UUID, SceneObjectPart>();
// Warning, The following code related to previousAttachmentStatus is needed so that clones of // Warning, The following code related to previousAttachmentStatus is needed so that clones of
@ -2537,10 +2540,10 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="objectGroup"></param> /// <param name="objectGroup"></param>
public virtual void DetachFromBackup() public virtual void DetachFromBackup()
{ {
if (m_isBackedUp && Scene != null) if (Backup && Scene != null)
m_scene.EventManager.OnBackup -= ProcessBackup; m_scene.EventManager.OnBackup -= ProcessBackup;
m_isBackedUp = false; Backup = false;
} }
// This links an SOP from a previous linkset into my linkset. // This links an SOP from a previous linkset into my linkset.
@ -2816,12 +2819,22 @@ namespace OpenSim.Region.Framework.Scenes
{ {
SceneObjectPart selectionPart = GetPart(localID); SceneObjectPart selectionPart = GetPart(localID);
if (SetTemporary && Scene != null) if (Scene != null)
{
if (SetTemporary)
{ {
DetachFromBackup(); DetachFromBackup();
// Remove from database and parcel prim count // Remove from database and parcel prim count
// //
m_scene.DeleteFromStorage(UUID); m_scene.DeleteFromStorage(UUID);
}
else if (!Backup)
{
// Previously been temporary now switching back so make it
// available for persisting again
AttachToBackup();
}
m_scene.EventManager.TriggerParcelPrimCountTainted(); m_scene.EventManager.TriggerParcelPrimCountTainted();
} }

View File

@ -57,6 +57,25 @@ namespace OpenSim.Region.Framework.Scenes.Tests
m_so2 = SceneHelpers.CreateSceneObject(1, m_ownerId, "so2", 0x20); m_so2 = SceneHelpers.CreateSceneObject(1, m_ownerId, "so2", 0x20);
} }
[Test]
public void TestSetTemporary()
{
TestHelpers.InMethod();
m_scene.AddSceneObject(m_so1);
m_so1.ScriptSetTemporaryStatus(true);
// Is this really the correct flag?
Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.TemporaryOnRez));
Assert.That(m_so1.Backup, Is.False);
// Test setting back to non-temporary
m_so1.ScriptSetTemporaryStatus(false);
Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.None));
Assert.That(m_so1.Backup, Is.True);
}
[Test] [Test]
public void TestSetPhantomSinglePrim() public void TestSetPhantomSinglePrim()
{ {