diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
index 50d8a73840..729667c5b7 100644
--- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
+++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
@@ -1909,7 +1909,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
m_log.Info("[RADMIN]: Received Estate Reload Request");
Hashtable responseData = (Hashtable)response.Value;
- Hashtable requestData = (Hashtable)request.Params[0];
+// Hashtable requestData = (Hashtable)request.Params[0];
m_application.SceneManager.ForEachScene(s =>
s.RegionInfo.EstateSettings = m_application.EstateDataService.LoadEstateSettings(s.RegionInfo.RegionID, false)
diff --git a/OpenSim/Data/MySQL/Resources/EstateStore.migrations b/OpenSim/Data/MySQL/Resources/EstateStore.migrations
index df82a2e1f8..2d1c2b50ab 100644
--- a/OpenSim/Data/MySQL/Resources/EstateStore.migrations
+++ b/OpenSim/Data/MySQL/Resources/EstateStore.migrations
@@ -77,5 +77,11 @@ BEGIN;
ALTER TABLE estate_settings AUTO_INCREMENT = 100;
COMMIT;
+:VERSION 33 #---------------------
+BEGIN;
+ALTER TABLE estate_settings ADD COLUMN `AllowLandmark` tinyint(4) NOT NULL default '1';
+ALTER TABLE estate_settings ADD COLUMN `AllowParcelChanges` tinyint(4) NOT NULL default '1';
+ALTER TABLE estate_settings ADD COLUMN `AllowSetHome` tinyint(4) NOT NULL default '1';
+COMMIT;
diff --git a/OpenSim/Data/SQLite/Resources/EstateStore.migrations b/OpenSim/Data/SQLite/Resources/EstateStore.migrations
index 62f6464460..0aec49b3e2 100644
--- a/OpenSim/Data/SQLite/Resources/EstateStore.migrations
+++ b/OpenSim/Data/SQLite/Resources/EstateStore.migrations
@@ -86,3 +86,12 @@ begin;
alter table estate_settings add column DenyMinors tinyint not null default 0;
commit;
+
+:VERSION 9
+
+begin;
+alter table estate_settings add column AllowLandmark tinyint not null default '1';
+alter table estate_settings add column AllowParcelChanges tinyint not null default '1';
+alter table estate_settings add column AllowSetHome tinyint not null default '1';
+commit;
+
diff --git a/OpenSim/Framework/Console/LocalConsole.cs b/OpenSim/Framework/Console/LocalConsole.cs
index d41481fb1c..a967db6271 100644
--- a/OpenSim/Framework/Console/LocalConsole.cs
+++ b/OpenSim/Framework/Console/LocalConsole.cs
@@ -420,6 +420,21 @@ namespace OpenSim.Framework.Console
SetCursorLeft(0);
m_cursorYPosition = SetCursorTop(m_cursorYPosition);
+ if (m_echo)
+ System.Console.Write("{0}{1} ", prompt, m_commandLine);
+ else
+ System.Console.Write("{0}", prompt);
+
+ break;
+ case ConsoleKey.Delete:
+ if (m_cursorXPosition == m_commandLine.Length)
+ break;
+
+ m_commandLine.Remove(m_cursorXPosition, 1);
+
+ SetCursorLeft(0);
+ m_cursorYPosition = SetCursorTop(m_cursorYPosition);
+
if (m_echo)
System.Console.Write("{0}{1} ", prompt, m_commandLine);
else
diff --git a/OpenSim/Framework/EstateSettings.cs b/OpenSim/Framework/EstateSettings.cs
index e03750bcc5..5ddbd6161e 100644
--- a/OpenSim/Framework/EstateSettings.cs
+++ b/OpenSim/Framework/EstateSettings.cs
@@ -430,6 +430,5 @@ namespace OpenSim.Framework
{
return l_EstateGroups.Contains(groupID);
}
-
}
}
diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs
index 9631a4625b..34c240af9d 100644
--- a/OpenSim/Framework/IClientAPI.cs
+++ b/OpenSim/Framework/IClientAPI.cs
@@ -1109,9 +1109,8 @@ namespace OpenSim.Framework
///
/// Tell the client that an object has been deleted
///
- ///
///
- void SendKillObject(ulong regionHandle, List localID);
+ void SendKillObject(List localID);
void SendAnimations(UUID[] animID, int[] seqs, UUID sourceAgentId, UUID[] objectIDs);
void SendRegionHandshake(RegionInfo regionInfo, RegionHandshakeArgs args);
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index 17b59da508..9de564bac4 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -1580,7 +1580,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
OutPacket(pc, ThrottleOutPacketType.Unknown);
}
- public void SendKillObject(ulong regionHandle, List localIDs)
+ public void SendKillObject(List localIDs)
{
// foreach (uint id in localIDs)
// m_log.DebugFormat("[CLIENT]: Sending KillObjectPacket to {0} for {1} in {2}", Name, id, regionHandle);
@@ -11961,8 +11961,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (part == null)
{
// It's a ghost! tell the client to delete it from view.
- simClient.SendKillObject(Scene.RegionInfo.RegionHandle,
- new List { localId });
+ simClient.SendKillObject(new List { localId });
}
else
{
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index cb724aa6c9..0f03ad0f74 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -841,7 +841,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
m_scene.ForEachClient(
client =>
{ if (client.AgentId != so.AttachedAvatar)
- client.SendKillObject(m_scene.RegionInfo.RegionHandle, new List() { so.LocalId });
+ client.SendKillObject(new List() { so.LocalId });
});
}
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs
index 1a38619134..8f9b17ea45 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs
@@ -833,11 +833,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(sceneA, 0x1);
AgentCircuitData acd = SceneHelpers.GenerateAgentData(ua1.PrincipalID);
- TestClient tc = new TestClient(acd, sceneA, sh.SceneManager);
+ TestClient tc = new TestClient(acd, sceneA);
List destinationTestClients = new List();
EntityTransferHelpers.SetUpInformClientOfNeighbour(tc, destinationTestClients);
- ScenePresence beforeTeleportSp = SceneHelpers.AddScenePresence(sceneA, tc, acd, sh.SceneManager);
+ ScenePresence beforeTeleportSp = SceneHelpers.AddScenePresence(sceneA, tc, acd);
beforeTeleportSp.AbsolutePosition = new Vector3(30, 31, 32);
InventoryItemBase attItem = CreateAttachmentItem(sceneA, ua1.PrincipalID, "att", 0x10, 0x20);
diff --git a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs
index f555b49f58..11a0146f09 100644
--- a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs
+++ b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs
@@ -104,14 +104,8 @@ namespace OpenSim.Region.Framework.Scenes
// better than losing the object for now.
if (permissionToDelete)
{
- List killIDs = new List();
-
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)
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index d2e41f8d38..257e070341 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -485,7 +485,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)
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 5860c9ae33..1023e258ab 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -3648,7 +3648,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 { avatar.LocalId }); }
+ try { client.SendKillObject(new List { avatar.LocalId }); }
catch (NullReferenceException) { }
});
}
@@ -3729,7 +3729,8 @@ namespace OpenSim.Region.Framework.Scenes
}
deleteIDs.Add(localID);
}
- ForEachClient(delegate(IClientAPI client) { client.SendKillObject(m_regionHandle, deleteIDs); });
+
+ ForEachClient(c => c.SendKillObject(deleteIDs));
}
#endregion
@@ -4382,8 +4383,6 @@ namespace OpenSim.Region.Framework.Scenes
m_log.DebugFormat(
"[SCENE]: Incoming child agent update for {0} in {1}", cAgentData.AgentID, RegionInfo.RegionName);
- // XPTO: if this agent is not allowed here as root, always return false
-
// We have to wait until the viewer contacts this region after receiving EAC.
// That calls AddNewClient, which finally creates the ScenePresence
int flags = GetUserFlags(cAgentData.AgentID);
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 69fb6df762..92e4fce7cc 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1857,11 +1857,11 @@ namespace OpenSim.Region.Framework.Scenes
///
/// Delete this group from its scene.
///
- ///
+ ///
/// 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.
- ///
+ ///
/// If true then deletion is not broadcast to clients
public void DeleteGroupFromScene(bool silent)
{
@@ -1875,10 +1875,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)
{
@@ -1886,9 +1886,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 { part.LocalId });
+ sp.ControllingClient.SendKillObject(new List { part.LocalId });
}
}
});
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectDeRezTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectDeRezTests.cs
index 52ad5380e3..d670dad654 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectDeRezTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectDeRezTests.cs
@@ -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;
+ }
+
///
/// Test deleting an object from a scene.
///
@@ -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 localIds = new List();
- 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));
+ }
+
+ ///
+ /// Test that child and root agents correctly receive KillObject notifications.
+ ///
+ [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 childClientsB = new List();
+ 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));
}
///
/// Test deleting an object from a scene where the deleter is not the owner
///
- ///
+ ///
/// This test assumes that the deleter is not a god.
+ ///
[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.
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceCrossingTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceCrossingTests.cs
index 8775949ff4..5a722398e2 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceCrossingTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceCrossingTests.cs
@@ -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 destinationTestClients = new List();
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;
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs
index de4458dde3..297c66b023 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs
@@ -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 destinationTestClients = new List();
@@ -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 destinationTestClients = new List();
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);
diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
index 550f089d97..f7b837cbef 100644
--- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
+++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
@@ -955,7 +955,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
}
- public void SendKillObject(ulong regionHandle, List localID)
+ public void SendKillObject(List localID)
{
}
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
index d1bb5472d3..a6a53aa0d2 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
@@ -596,7 +596,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
}
- public virtual void SendKillObject(ulong regionHandle, List localID)
+ public virtual void SendKillObject(List localID)
{
}
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSShapes.cs b/OpenSim/Region/Physics/BulletSPlugin/BSShapes.cs
index f89c52f787..2dc029e29f 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSShapes.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSShapes.cs
@@ -368,9 +368,10 @@ public class BSShapeMesh : BSShape
// Check to see if mesh was created (might require an asset).
newShape = VerifyMeshCreated(physicsScene, newShape, prim);
- if (!newShape.isNativeShape)
+ if (!newShape.isNativeShape || prim.PrimAssetState == BSPhysObject.PrimAssetCondition.Failed)
{
// If a mesh was what was created, remember the built shape for later sharing.
+ // Also note that if meshing failed we put it in the mesh list as there is nothing else to do about the mesh.
Meshes.Add(newMeshKey, retMesh);
}
@@ -483,8 +484,11 @@ public class BSShapeMesh : BSShape
}
else
{
+ // Force the asset condition to 'failed' so we won't try to keep fetching and processing this mesh.
+ prim.PrimAssetState = BSPhysObject.PrimAssetCondition.Failed;
physicsScene.Logger.DebugFormat("{0} All mesh triangles degenerate. Prim {1} at {2} in {3}",
LogHeader, prim.PhysObjectName, prim.RawPosition, physicsScene.Name);
+ physicsScene.DetailLog("{0},BSShapeMesh.CreatePhysicalMesh,allDegenerate,key={1}", prim.LocalID, newMeshKey);
}
}
newShape.shapeKey = newMeshKey;
@@ -523,7 +527,7 @@ public class BSShapeHull : BSShape
// Check to see if hull was created (might require an asset).
newShape = VerifyMeshCreated(physicsScene, newShape, prim);
- if (!newShape.isNativeShape)
+ if (!newShape.isNativeShape || prim.PrimAssetState == BSPhysObject.PrimAssetCondition.Failed)
{
// If a mesh was what was created, remember the built shape for later sharing.
Hulls.Add(newHullKey, retHull);
diff --git a/OpenSim/Services/LLLoginService/LLLoginResponse.cs b/OpenSim/Services/LLLoginService/LLLoginResponse.cs
index e2f947c1f7..da6c016ae9 100644
--- a/OpenSim/Services/LLLoginService/LLLoginResponse.cs
+++ b/OpenSim/Services/LLLoginService/LLLoginResponse.cs
@@ -233,7 +233,7 @@ namespace OpenSim.Services.LLLoginService
GridRegion destination, List invSkel, FriendInfo[] friendsList, ILibraryService libService,
string where, string startlocation, Vector3 position, Vector3 lookAt, List gestures, string message,
GridRegion home, IPEndPoint clientIP, string mapTileURL, string profileURL, string openIDURL, string searchURL, string currency,
- string DSTZone, UUID realID)
+ string DSTZone, string destinationsURL, string avatarsURL, UUID realID)
: this()
{
FillOutInventoryData(invSkel, libService);
@@ -253,6 +253,8 @@ namespace OpenSim.Services.LLLoginService
MapTileURL = mapTileURL;
ProfileURL = profileURL;
OpenIDURL = openIDURL;
+ DestinationsURL = destinationsURL;
+ AvatarsURL = avatarsURL;
SearchURL = searchURL;
Currency = currency;
@@ -543,6 +545,12 @@ namespace OpenSim.Services.LLLoginService
if (profileURL != String.Empty)
responseData["profile-server-url"] = profileURL;
+ if (DestinationsURL != String.Empty)
+ responseData["destination_guide_url"] = DestinationsURL;
+
+ if (AvatarsURL != String.Empty)
+ responseData["avatar_picker_url"] = AvatarsURL;
+
// We need to send an openid_token back in the response too
if (openIDURL != String.Empty)
responseData["openid_url"] = openIDURL;
@@ -1073,6 +1081,16 @@ namespace OpenSim.Services.LLLoginService
set { currency = value; }
}
+ public string DestinationsURL
+ {
+ get; set;
+ }
+
+ public string AvatarsURL
+ {
+ get; set;
+ }
+
#endregion
public class UserInfo
diff --git a/OpenSim/Services/LLLoginService/LLLoginService.cs b/OpenSim/Services/LLLoginService/LLLoginService.cs
index ede2353d9b..351c1accaa 100644
--- a/OpenSim/Services/LLLoginService/LLLoginService.cs
+++ b/OpenSim/Services/LLLoginService/LLLoginService.cs
@@ -78,6 +78,8 @@ namespace OpenSim.Services.LLLoginService
protected string m_OpenIDURL;
protected string m_SearchURL;
protected string m_Currency;
+ protected string m_DestinationGuide;
+ protected string m_AvatarPicker;
protected string m_AllowedClients;
protected string m_DeniedClients;
@@ -117,6 +119,8 @@ namespace OpenSim.Services.LLLoginService
m_OpenIDURL = m_LoginServerConfig.GetString("OpenIDServerURL", String.Empty);
m_SearchURL = m_LoginServerConfig.GetString("SearchURL", string.Empty);
m_Currency = m_LoginServerConfig.GetString("Currency", string.Empty);
+ m_DestinationGuide = m_LoginServerConfig.GetString ("DestinationGuide", string.Empty);
+ m_AvatarPicker = m_LoginServerConfig.GetString ("AvatarPicker", string.Empty);
m_AllowedClients = m_LoginServerConfig.GetString("AllowedClients", string.Empty);
m_DeniedClients = m_LoginServerConfig.GetString("DeniedClients", string.Empty);
@@ -461,7 +465,8 @@ namespace OpenSim.Services.LLLoginService
= new LLLoginResponse(
account, aCircuit, guinfo, destination, inventorySkel, friendsList, m_LibraryService,
where, startLocation, position, lookAt, gestures, m_WelcomeMessage, home, clientIP,
- m_MapTileURL, m_ProfileURL, m_OpenIDURL, m_SearchURL, m_Currency, m_DSTZone, realID);
+ m_MapTileURL, m_ProfileURL, m_OpenIDURL, m_SearchURL, m_Currency, m_DSTZone,
+ m_DestinationGuide, m_AvatarPicker, realID);
m_log.DebugFormat("[LLOGIN SERVICE]: All clear. Sending login response to {0} {1}", firstName, lastName);
diff --git a/OpenSim/Tests/Common/Helpers/EntityTransferHelpers.cs b/OpenSim/Tests/Common/Helpers/EntityTransferHelpers.cs
index 6cc7ff259d..1b960b1f5d 100644
--- a/OpenSim/Tests/Common/Helpers/EntityTransferHelpers.cs
+++ b/OpenSim/Tests/Common/Helpers/EntityTransferHelpers.cs
@@ -82,7 +82,7 @@ namespace OpenSim.Tests.Common
Scene neighbourScene;
SceneManager.Instance.TryGetScene(x, y, out neighbourScene);
- TestClient neighbourTc = new TestClient(newAgent, neighbourScene, SceneManager.Instance);
+ TestClient neighbourTc = new TestClient(newAgent, neighbourScene);
neighbourTcs.Add(neighbourTc);
neighbourScene.AddNewClient(neighbourTc, PresenceType.User);
};
diff --git a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs
index bdd90939e7..d9bb85e006 100644
--- a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs
+++ b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs
@@ -447,9 +447,6 @@ namespace OpenSim.Tests.Common
/// Add a root agent where the details of the agent connection (apart from the id) are unimportant for the test
///
///
- /// This can be used for tests where there is only one region or where there are multiple non-neighbour regions
- /// and teleport doesn't take place.
- ///
/// XXX: Use the version of this method that takes the UserAccount structure wherever possible - this will
/// make the agent circuit data (e.g. first, lastname) consistent with the user account data.
///
@@ -461,22 +458,6 @@ namespace OpenSim.Tests.Common
return AddScenePresence(scene, GenerateAgentData(agentId));
}
- ///
- /// Add a root agent where the details of the agent connection (apart from the id) are unimportant for the test
- ///
- ///
- /// XXX: Use the version of this method that takes the UserAccount structure wherever possible - this will
- /// make the agent circuit data (e.g. first, lastname) consistent with the user account data.
- ///
- ///
- ///
- ///
- ///
- public static ScenePresence AddScenePresence(Scene scene, UUID agentId, SceneManager sceneManager)
- {
- return AddScenePresence(scene, GenerateAgentData(agentId), sceneManager);
- }
-
///
/// Add a root agent.
///
@@ -508,7 +489,7 @@ namespace OpenSim.Tests.Common
///
public static ScenePresence AddScenePresence(Scene scene, AgentCircuitData agentData)
{
- return AddScenePresence(scene, agentData, null);
+ return AddScenePresence(scene, new TestClient(agentData, scene), agentData);
}
///
@@ -528,34 +509,9 @@ namespace OpenSim.Tests.Common
///
///
///
- ///
- ///
- public static ScenePresence AddScenePresence(Scene scene, AgentCircuitData agentData, SceneManager sceneManager)
- {
- return AddScenePresence(scene, new TestClient(agentData, scene, sceneManager), agentData, sceneManager);
- }
-
- ///
- /// Add a root agent.
- ///
- ///
- /// This function
- ///
- /// 1) Tells the scene that an agent is coming. Normally, the login service (local if standalone, from the
- /// userserver if grid) would give initial login data back to the client and separately tell the scene that the
- /// agent was coming.
- ///
- /// 2) Connects the agent with the scene
- ///
- /// This function performs actions equivalent with notifying the scene that an agent is
- /// coming and then actually connecting the agent to the scene. The one step missed out is the very first
- ///
- ///
- ///
- ///
///
public static ScenePresence AddScenePresence(
- Scene scene, IClientAPI client, AgentCircuitData agentData, SceneManager sceneManager)
+ Scene scene, IClientAPI client, AgentCircuitData agentData)
{
// We emulate the proper login sequence here by doing things in four stages
@@ -578,10 +534,6 @@ namespace OpenSim.Tests.Common
/// Introduce an agent into the scene by adding a new client.
///
/// The scene presence added
- ///
- /// Scene manager. Can be null if there is only one region in the test or multiple regions that are not
- /// neighbours and where no teleporting takes place.
- ///
///
///
///
@@ -607,7 +559,7 @@ namespace OpenSim.Tests.Common
acd.child = true;
// XXX: ViaLogin may not be correct for child agents
- TestClient client = new TestClient(acd, scene, null);
+ TestClient client = new TestClient(acd, scene);
return IntroduceClientToScene(scene, client, acd, TeleportFlags.ViaLogin);
}
diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs
index 32f6a6480d..26479bede5 100644
--- a/OpenSim/Tests/Common/Mock/TestClient.cs
+++ b/OpenSim/Tests/Common/Mock/TestClient.cs
@@ -47,9 +47,9 @@ namespace OpenSim.Tests.Common.Mock
EventWaitHandle wh = new EventWaitHandle (false, EventResetMode.AutoReset, "Crossing");
private Scene m_scene;
- private SceneManager m_sceneManager;
// Properties so that we can get at received data for test purposes
+ public List ReceivedKills { get; private set; }
public List ReceivedOfflineNotifications { get; private set; }
public List ReceivedOnlineNotifications { get; private set; }
public List ReceivedFriendshipTerminations { get; private set; }
@@ -434,36 +434,24 @@ namespace OpenSim.Tests.Common.Mock
get { return new IPEndPoint(IPAddress.Loopback, (ushort)m_circuitCode); }
}
- ///
- /// Constructor
- ///
- ///
- /// Can be used for a test where there is only one region or where there are multiple regions that are not
- /// neighbours and where no teleporting takes place. In other situations, the constructor that takes in a
- /// scene manager should be used.
- ///
- ///
- ///
- public TestClient(AgentCircuitData agentData, Scene scene) : this(agentData, scene, null) {}
-
///
/// Constructor
///
///
///
///
- public TestClient(AgentCircuitData agentData, Scene scene, SceneManager sceneManager)
+ public TestClient(AgentCircuitData agentData, Scene scene)
{
m_agentId = agentData.AgentID;
m_firstName = agentData.firstname;
m_lastName = agentData.lastname;
m_circuitCode = agentData.circuitcode;
m_scene = scene;
- m_sceneManager = sceneManager;
SessionId = agentData.SessionID;
SecureSessionId = agentData.SecureSessionID;
CapsSeedUrl = agentData.CapsPath;
+ ReceivedKills = new List();
ReceivedOfflineNotifications = new List();
ReceivedOnlineNotifications = new List();
ReceivedFriendshipTerminations = new List();
@@ -532,11 +520,11 @@ namespace OpenSim.Tests.Common.Mock
public virtual void SendAgentDataUpdate(UUID agentid, UUID activegroupid, string firstname, string lastname, ulong grouppowers, string groupname, string grouptitle)
{
-
}
- public virtual void SendKillObject(ulong regionHandle, List localID)
+ public virtual void SendKillObject(List localID)
{
+ ReceivedKills.AddRange(localID);
}
public virtual void SetChildAgentThrottle(byte[] throttle)
@@ -545,15 +533,13 @@ namespace OpenSim.Tests.Common.Mock
public void SetAgentThrottleSilent(int throttle, int setting)
{
-
-
}
+
public byte[] GetThrottlesPacked(float multiplier)
{
return new byte[0];
}
-
public virtual void SendAnimations(UUID[] animations, int[] seqs, UUID sourceAgentId, UUID[] objectIDs)
{
}
diff --git a/OpenSim/Tests/Common/Mock/TestXInventoryDataPlugin.cs b/OpenSim/Tests/Common/Mock/TestXInventoryDataPlugin.cs
index 30b1f38156..2be5524c21 100644
--- a/OpenSim/Tests/Common/Mock/TestXInventoryDataPlugin.cs
+++ b/OpenSim/Tests/Common/Mock/TestXInventoryDataPlugin.cs
@@ -118,8 +118,8 @@ namespace OpenSim.Tests.Common.Mock
folder.parentFolderID = new UUID(newParent);
- XInventoryFolder[] newParentFolders
- = GetFolders(new string[] { "folderID" }, new string[] { folder.parentFolderID.ToString() });
+// XInventoryFolder[] newParentFolders
+// = GetFolders(new string[] { "folderID" }, new string[] { folder.parentFolderID.ToString() });
// Console.WriteLine(
// "Moved folder {0} {1}, to {2} {3}",
diff --git a/bin/Robust.HG.ini.example b/bin/Robust.HG.ini.example
index fee2a87b4b..bc2b4cfb29 100644
--- a/bin/Robust.HG.ini.example
+++ b/bin/Robust.HG.ini.example
@@ -325,6 +325,12 @@ HGAssetServiceConnector = "HGAssetService@8002/OpenSim.Server.Handlers.dll:Asset
; For V2/V3 webapp authentication SSO
; OpenIDServerURL = "http://127.0.0.1/openid/openidserver/"
+ ; For V3 destination guide
+ ; DestinationGuide = "http://127.0.0.1/guide"
+
+ ; For V3 avatar picker (( work in progress ))
+ ; AvatarPicker = "http://127.0.0.1/avatars"
+
; If you run this login server behind a proxy, set this to true
; HasProxy = false
diff --git a/bin/Robust.ini.example b/bin/Robust.ini.example
index 2d5aa8c87c..1d66b7fcfd 100644
--- a/bin/Robust.ini.example
+++ b/bin/Robust.ini.example
@@ -288,6 +288,12 @@ MapGetServiceConnector = "8002/OpenSim.Server.Handlers.dll:MapGetServiceConnecto
; For V2/V3 webapp authentication SSO
; OpenIDServerURL = "http://127.0.0.1/openid/openidserver/"
+ ; For V3 destination guide
+ ; DestinationGuide = "http://127.0.0.1/guide"
+
+ ; For V3 avatar picker (( work in progress ))
+ ; AvatarPicker = "http://127.0.0.1/avatars"
+
; If you run this login server behind a proxy, set this to true
; HasProxy = false