mirror of
https://github.com/opensim/opensim.git
synced 2026-08-12 12:25:42 +08:00
Merge branch 'master' of melanie@opensimulator.org:/var/git/opensim
This commit is contained in:
@@ -104,14 +104,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
// better than losing the object for now.
|
||||
if (permissionToDelete)
|
||||
{
|
||||
List<uint> killIDs = new List<uint>();
|
||||
|
||||
foreach (SceneObjectGroup g in objectGroups)
|
||||
{ killIDs.Add(g.LocalId);
|
||||
g.DeleteGroupFromScene(true);
|
||||
}
|
||||
|
||||
m_scene.SendKillObject(killIDs);
|
||||
g.DeleteGroupFromScene(false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -160,7 +154,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
if (x.permissionToDelete)
|
||||
{
|
||||
foreach (SceneObjectGroup g in x.objectGroups)
|
||||
m_scene.DeleteSceneObject(g, false);
|
||||
m_scene.DeleteSceneObject(g, true);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
|
||||
@@ -490,7 +490,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
item.SaleType = itemUpd.SaleType;
|
||||
|
||||
InventoryService.UpdateItem(item);
|
||||
remoteClient.SendBulkUpdateInventory(item);
|
||||
|
||||
// We cannot send out a bulk update here, since this will cause editing of clothing to start
|
||||
// failing frequently. Possibly this is a race with a separate transaction that uploads the asset.
|
||||
// remoteClient.SendBulkUpdateInventory(item);
|
||||
}
|
||||
|
||||
if (UUID.Zero != transactionID)
|
||||
|
||||
@@ -3480,7 +3480,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
delegate(IClientAPI client)
|
||||
{
|
||||
//We can safely ignore null reference exceptions. It means the avatar is dead and cleaned up anyway
|
||||
try { client.SendKillObject(avatar.RegionHandle, new List<uint> { avatar.LocalId }); }
|
||||
try { client.SendKillObject(new List<uint> { avatar.LocalId }); }
|
||||
catch (NullReferenceException) { }
|
||||
});
|
||||
}
|
||||
@@ -3560,7 +3560,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
}
|
||||
deleteIDs.Add(localID);
|
||||
}
|
||||
ForEachClient(delegate(IClientAPI client) { client.SendKillObject(m_regionHandle, deleteIDs); });
|
||||
|
||||
ForEachClient(c => c.SendKillObject(deleteIDs));
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -1221,11 +1221,11 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
/// <summary>
|
||||
/// Delete this group from its scene.
|
||||
/// </summary>
|
||||
///
|
||||
/// <remarks>
|
||||
/// This only handles the in-world consequences of deletion (e.g. any avatars sitting on it are forcibly stood
|
||||
/// up and all avatars receive notification of its removal. Removal of the scene object from database backup
|
||||
/// must be handled by the caller.
|
||||
///
|
||||
/// </remarks>
|
||||
/// <param name="silent">If true then deletion is not broadcast to clients</param>
|
||||
public void DeleteGroupFromScene(bool silent)
|
||||
{
|
||||
@@ -1234,10 +1234,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
{
|
||||
SceneObjectPart part = parts[i];
|
||||
|
||||
Scene.ForEachRootScenePresence(delegate(ScenePresence avatar)
|
||||
Scene.ForEachScenePresence(sp =>
|
||||
{
|
||||
if (avatar.ParentID == LocalId)
|
||||
avatar.StandUp();
|
||||
if (!sp.IsChildAgent && sp.ParentID == LocalId)
|
||||
sp.StandUp();
|
||||
|
||||
if (!silent)
|
||||
{
|
||||
@@ -1245,9 +1245,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
if (part == m_rootPart)
|
||||
{
|
||||
if (!IsAttachment
|
||||
|| AttachedAvatar == avatar.ControllingClient.AgentId
|
||||
|| AttachedAvatar == sp.UUID
|
||||
|| !HasPrivateAttachmentPoint)
|
||||
avatar.ControllingClient.SendKillObject(m_regionHandle, new List<uint> { part.LocalId });
|
||||
sp.ControllingClient.SendKillObject(new List<uint> { part.LocalId });
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -33,7 +33,9 @@ using NUnit.Framework;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Communications;
|
||||
using OpenSim.Region.CoreModules.Framework.EntityTransfer;
|
||||
using OpenSim.Region.CoreModules.Framework.InventoryAccess;
|
||||
using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation;
|
||||
using OpenSim.Region.CoreModules.World.Permissions;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Services.Interfaces;
|
||||
@@ -52,6 +54,24 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
||||
[TestFixture]
|
||||
public class SceneObjectDeRezTests : OpenSimTestCase
|
||||
{
|
||||
[TestFixtureSetUp]
|
||||
public void FixtureInit()
|
||||
{
|
||||
// Don't allow tests to be bamboozled by asynchronous events. Execute everything on the same thread.
|
||||
// This facility was added after the original async delete tests were written, so it may be possible now
|
||||
// to not bother explicitly disabling their async (since everything will be running sync).
|
||||
Util.FireAndForgetMethod = FireAndForgetMethod.RegressionTest;
|
||||
}
|
||||
|
||||
[TestFixtureTearDown]
|
||||
public void TearDown()
|
||||
{
|
||||
// We must set this back afterwards, otherwise later tests will fail since they're expecting multiple
|
||||
// threads. Possibly, later tests should be rewritten so none of them require async stuff (which regression
|
||||
// tests really shouldn't).
|
||||
Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Test deleting an object from a scene.
|
||||
/// </summary>
|
||||
@@ -59,46 +79,96 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
||||
public void TestDeRezSceneObject()
|
||||
{
|
||||
TestHelpers.InMethod();
|
||||
// log4net.Config.XmlConfigurator.Configure();
|
||||
|
||||
UUID userId = UUID.Parse("10000000-0000-0000-0000-000000000001");
|
||||
|
||||
TestScene scene = new SceneHelpers().SetupScene();
|
||||
IConfigSource configSource = new IniConfigSource();
|
||||
IConfig config = configSource.AddConfig("Startup");
|
||||
config.Set("serverside_object_permissions", true);
|
||||
SceneHelpers.SetupSceneModules(scene, configSource, new object[] { new PermissionsModule() });
|
||||
IClientAPI client = SceneHelpers.AddScenePresence(scene, userId).ControllingClient;
|
||||
SceneHelpers.SetupSceneModules(scene, new PermissionsModule());
|
||||
TestClient client = (TestClient)SceneHelpers.AddScenePresence(scene, userId).ControllingClient;
|
||||
|
||||
// Turn off the timer on the async sog deleter - we'll crank it by hand for this test.
|
||||
AsyncSceneObjectGroupDeleter sogd = scene.SceneObjectGroupDeleter;
|
||||
sogd.Enabled = false;
|
||||
|
||||
SceneObjectPart part
|
||||
= new SceneObjectPart(userId, PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero);
|
||||
part.Name = "obj1";
|
||||
scene.AddNewSceneObject(new SceneObjectGroup(part), false);
|
||||
|
||||
SceneObjectGroup so = SceneHelpers.AddSceneObject(scene, "so1", userId);
|
||||
uint soLocalId = so.LocalId;
|
||||
|
||||
List<uint> localIds = new List<uint>();
|
||||
localIds.Add(part.LocalId);
|
||||
localIds.Add(so.LocalId);
|
||||
scene.DeRezObjects(client, localIds, UUID.Zero, DeRezAction.Delete, UUID.Zero);
|
||||
|
||||
// Check that object isn't deleted until we crank the sogd handle.
|
||||
SceneObjectPart retrievedPart = scene.GetSceneObjectPart(part.LocalId);
|
||||
SceneObjectPart retrievedPart = scene.GetSceneObjectPart(so.LocalId);
|
||||
Assert.That(retrievedPart, Is.Not.Null);
|
||||
Assert.That(retrievedPart.ParentGroup.IsDeleted, Is.False);
|
||||
|
||||
sogd.InventoryDeQueueAndDelete();
|
||||
|
||||
SceneObjectPart retrievedPart2 = scene.GetSceneObjectPart(part.LocalId);
|
||||
Assert.That(retrievedPart2, Is.Null);
|
||||
SceneObjectPart retrievedPart2 = scene.GetSceneObjectPart(so.LocalId);
|
||||
Assert.That(retrievedPart2, Is.Null);
|
||||
|
||||
Assert.That(client.ReceivedKills.Count, Is.EqualTo(1));
|
||||
Assert.That(client.ReceivedKills[0], Is.EqualTo(soLocalId));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Test that child and root agents correctly receive KillObject notifications.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TestDeRezSceneObjectToAgents()
|
||||
{
|
||||
TestHelpers.InMethod();
|
||||
// TestHelpers.EnableLogging();
|
||||
|
||||
SceneHelpers sh = new SceneHelpers();
|
||||
TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000);
|
||||
TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1000, 999);
|
||||
|
||||
// We need this so that the creation of the root client for userB in sceneB can trigger the creation of a child client in sceneA
|
||||
LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule();
|
||||
EntityTransferModule etmB = new EntityTransferModule();
|
||||
IConfigSource config = new IniConfigSource();
|
||||
IConfig modulesConfig = config.AddConfig("Modules");
|
||||
modulesConfig.Set("EntityTransferModule", etmB.Name);
|
||||
modulesConfig.Set("SimulationServices", lscm.Name);
|
||||
SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm);
|
||||
SceneHelpers.SetupSceneModules(sceneB, config, etmB);
|
||||
|
||||
// We need this for derez
|
||||
SceneHelpers.SetupSceneModules(sceneA, new PermissionsModule());
|
||||
|
||||
UserAccount uaA = UserAccountHelpers.CreateUserWithInventory(sceneA, "Andy", "AAA", 0x1, "");
|
||||
UserAccount uaB = UserAccountHelpers.CreateUserWithInventory(sceneA, "Brian", "BBB", 0x2, "");
|
||||
|
||||
TestClient clientA = (TestClient)SceneHelpers.AddScenePresence(sceneA, uaA).ControllingClient;
|
||||
|
||||
// This is the more long-winded route we have to take to get a child client created for userB in sceneA
|
||||
// rather than just calling AddScenePresence() as for userA
|
||||
AgentCircuitData acd = SceneHelpers.GenerateAgentData(uaB);
|
||||
TestClient clientB = new TestClient(acd, sceneB);
|
||||
List<TestClient> childClientsB = new List<TestClient>();
|
||||
EntityTransferHelpers.SetUpInformClientOfNeighbour(clientB, childClientsB);
|
||||
|
||||
SceneHelpers.AddScenePresence(sceneB, clientB, acd);
|
||||
|
||||
SceneObjectGroup so = SceneHelpers.AddSceneObject(sceneA);
|
||||
uint soLocalId = so.LocalId;
|
||||
|
||||
sceneA.DeleteSceneObject(so, false);
|
||||
|
||||
Assert.That(clientA.ReceivedKills.Count, Is.EqualTo(1));
|
||||
Assert.That(clientA.ReceivedKills[0], Is.EqualTo(soLocalId));
|
||||
|
||||
Assert.That(childClientsB[0].ReceivedKills.Count, Is.EqualTo(1));
|
||||
Assert.That(childClientsB[0].ReceivedKills[0], Is.EqualTo(soLocalId));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Test deleting an object from a scene where the deleter is not the owner
|
||||
/// </summary>
|
||||
///
|
||||
/// <remarks>
|
||||
/// This test assumes that the deleter is not a god.
|
||||
/// </remarks>
|
||||
[Test]
|
||||
public void TestDeRezSceneObjectNotOwner()
|
||||
{
|
||||
@@ -109,10 +179,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
||||
UUID objectOwnerId = UUID.Parse("20000000-0000-0000-0000-000000000001");
|
||||
|
||||
TestScene scene = new SceneHelpers().SetupScene();
|
||||
IConfigSource configSource = new IniConfigSource();
|
||||
IConfig config = configSource.AddConfig("Startup");
|
||||
config.Set("serverside_object_permissions", true);
|
||||
SceneHelpers.SetupSceneModules(scene, configSource, new object[] { new PermissionsModule() });
|
||||
SceneHelpers.SetupSceneModules(scene, new PermissionsModule());
|
||||
IClientAPI client = SceneHelpers.AddScenePresence(scene, userId).ControllingClient;
|
||||
|
||||
// Turn off the timer on the async sog deleter - we'll crank it by hand for this test.
|
||||
|
||||
@@ -95,11 +95,11 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
||||
SceneHelpers.SetupSceneModules(sceneB, config, new CapabilitiesModule(), etmB);
|
||||
|
||||
AgentCircuitData acd = SceneHelpers.GenerateAgentData(userId);
|
||||
TestClient tc = new TestClient(acd, sceneA, sh.SceneManager);
|
||||
TestClient tc = new TestClient(acd, sceneA);
|
||||
List<TestClient> destinationTestClients = new List<TestClient>();
|
||||
EntityTransferHelpers.SetUpInformClientOfNeighbour(tc, destinationTestClients);
|
||||
|
||||
ScenePresence originalSp = SceneHelpers.AddScenePresence(sceneA, tc, acd, sh.SceneManager);
|
||||
ScenePresence originalSp = SceneHelpers.AddScenePresence(sceneA, tc, acd);
|
||||
originalSp.AbsolutePosition = new Vector3(128, 32, 10);
|
||||
|
||||
// originalSp.Flying = true;
|
||||
|
||||
@@ -139,7 +139,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
||||
Vector3 teleportPosition = new Vector3(10, 11, 12);
|
||||
Vector3 teleportLookAt = new Vector3(20, 21, 22);
|
||||
|
||||
ScenePresence sp = SceneHelpers.AddScenePresence(sceneA, userId, sh.SceneManager);
|
||||
ScenePresence sp = SceneHelpers.AddScenePresence(sceneA, userId);
|
||||
sp.AbsolutePosition = new Vector3(30, 31, 32);
|
||||
|
||||
List<TestClient> destinationTestClients = new List<TestClient>();
|
||||
@@ -224,7 +224,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
||||
Vector3 teleportPosition = new Vector3(10, 11, 12);
|
||||
Vector3 teleportLookAt = new Vector3(20, 21, 22);
|
||||
|
||||
ScenePresence sp = SceneHelpers.AddScenePresence(sceneA, userId, sh.SceneManager);
|
||||
ScenePresence sp = SceneHelpers.AddScenePresence(sceneA, userId);
|
||||
sp.AbsolutePosition = preTeleportPosition;
|
||||
|
||||
// Make sceneB return false on query access
|
||||
@@ -300,7 +300,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
||||
Vector3 teleportPosition = new Vector3(10, 11, 12);
|
||||
Vector3 teleportLookAt = new Vector3(20, 21, 22);
|
||||
|
||||
ScenePresence sp = SceneHelpers.AddScenePresence(sceneA, userId, sh.SceneManager);
|
||||
ScenePresence sp = SceneHelpers.AddScenePresence(sceneA, userId);
|
||||
sp.AbsolutePosition = preTeleportPosition;
|
||||
|
||||
// Make sceneB refuse CreateAgent
|
||||
@@ -389,7 +389,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
||||
Vector3 teleportPosition = new Vector3(10, 11, 12);
|
||||
Vector3 teleportLookAt = new Vector3(20, 21, 22);
|
||||
|
||||
ScenePresence sp = SceneHelpers.AddScenePresence(sceneA, userId, sh.SceneManager);
|
||||
ScenePresence sp = SceneHelpers.AddScenePresence(sceneA, userId);
|
||||
sp.AbsolutePosition = preTeleportPosition;
|
||||
|
||||
sceneA.RequestTeleportLocation(
|
||||
@@ -428,7 +428,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
||||
public void TestSameSimulatorNeighbouringRegions()
|
||||
{
|
||||
TestHelpers.InMethod();
|
||||
TestHelpers.EnableLogging();
|
||||
// TestHelpers.EnableLogging();
|
||||
|
||||
UUID userId = TestHelpers.ParseTail(0x1);
|
||||
|
||||
@@ -458,11 +458,11 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
||||
Vector3 teleportLookAt = new Vector3(20, 21, 22);
|
||||
|
||||
AgentCircuitData acd = SceneHelpers.GenerateAgentData(userId);
|
||||
TestClient tc = new TestClient(acd, sceneA, sh.SceneManager);
|
||||
TestClient tc = new TestClient(acd, sceneA);
|
||||
List<TestClient> destinationTestClients = new List<TestClient>();
|
||||
EntityTransferHelpers.SetUpInformClientOfNeighbour(tc, destinationTestClients);
|
||||
|
||||
ScenePresence beforeSceneASp = SceneHelpers.AddScenePresence(sceneA, tc, acd, sh.SceneManager);
|
||||
ScenePresence beforeSceneASp = SceneHelpers.AddScenePresence(sceneA, tc, acd);
|
||||
beforeSceneASp.AbsolutePosition = new Vector3(30, 31, 32);
|
||||
|
||||
Assert.That(beforeSceneASp, Is.Not.Null);
|
||||
|
||||
Reference in New Issue
Block a user