aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Data/Tests/RegionTests.cs12
-rw-r--r--OpenSim/Framework/ILandObject.cs6
-rw-r--r--OpenSim/Region/Application/OpenSim.cs4
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs4
-rw-r--r--OpenSim/Region/CoreModules/World/Land/LandObject.cs11
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Inventory.cs182
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs15
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSScene.cs33
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs4
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODECharacter.cs3
-rw-r--r--OpenSim/Region/Physics/OdePlugin/OdeScene.cs30
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs14
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs1
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs5
-rw-r--r--OpenSim/Region/UserStatistics/WebStatsModule.cs6
15 files changed, 219 insertions, 111 deletions
diff --git a/OpenSim/Data/Tests/RegionTests.cs b/OpenSim/Data/Tests/RegionTests.cs
index 1b93176..1d806fc 100644
--- a/OpenSim/Data/Tests/RegionTests.cs
+++ b/OpenSim/Data/Tests/RegionTests.cs
@@ -685,7 +685,7 @@ namespace OpenSim.Data.Tests
685 SceneObjectGroup sog = GetMySOG("object1"); 685 SceneObjectGroup sog = GetMySOG("object1");
686 InventoryItemBase i = NewItem(item1, zero, zero, itemname1, zero); 686 InventoryItemBase i = NewItem(item1, zero, zero, itemname1, zero);
687 687
688 Assert.That(sog.AddInventoryItem(null, sog.RootPart.LocalId, i, zero), Is.True); 688 Assert.That(sog.AddInventoryItem(zero, sog.RootPart.LocalId, i, zero), Is.True);
689 TaskInventoryItem t = sog.GetInventoryItem(sog.RootPart.LocalId, item1); 689 TaskInventoryItem t = sog.GetInventoryItem(sog.RootPart.LocalId, item1);
690 Assert.That(t.Name, Is.EqualTo(itemname1), "Assert.That(t.Name, Is.EqualTo(itemname1))"); 690 Assert.That(t.Name, Is.EqualTo(itemname1), "Assert.That(t.Name, Is.EqualTo(itemname1))");
691 691
@@ -762,7 +762,7 @@ namespace OpenSim.Data.Tests
762 i.CreationDate = creationd; 762 i.CreationDate = creationd;
763 763
764 SceneObjectGroup sog = GetMySOG("object1"); 764 SceneObjectGroup sog = GetMySOG("object1");
765 Assert.That(sog.AddInventoryItem(null, sog.RootPart.LocalId, i, zero), Is.True); 765 Assert.That(sog.AddInventoryItem(zero, sog.RootPart.LocalId, i, zero), Is.True);
766 TaskInventoryItem t = sog.GetInventoryItem(sog.RootPart.LocalId, id); 766 TaskInventoryItem t = sog.GetInventoryItem(sog.RootPart.LocalId, id);
767 767
768 Assert.That(t.Name, Is.EqualTo(name), "Assert.That(t.Name, Is.EqualTo(name))"); 768 Assert.That(t.Name, Is.EqualTo(name), "Assert.That(t.Name, Is.EqualTo(name))");
@@ -807,10 +807,10 @@ namespace OpenSim.Data.Tests
807 807
808 SceneObjectGroup sog = FindSOG("object1", region1); 808 SceneObjectGroup sog = FindSOG("object1", region1);
809 809
810 Assert.That(sog.AddInventoryItem(null, sog.RootPart.LocalId, ib1, zero), Is.True); 810 Assert.That(sog.AddInventoryItem(zero, sog.RootPart.LocalId, ib1, zero), Is.True);
811 Assert.That(sog.AddInventoryItem(null, sog.RootPart.LocalId, ib2, zero), Is.True); 811 Assert.That(sog.AddInventoryItem(zero, sog.RootPart.LocalId, ib2, zero), Is.True);
812 Assert.That(sog.AddInventoryItem(null, sog.RootPart.LocalId, ib3, zero), Is.True); 812 Assert.That(sog.AddInventoryItem(zero, sog.RootPart.LocalId, ib3, zero), Is.True);
813 Assert.That(sog.AddInventoryItem(null, sog.RootPart.LocalId, ib4, zero), Is.True); 813 Assert.That(sog.AddInventoryItem(zero, sog.RootPart.LocalId, ib4, zero), Is.True);
814 814
815 TaskInventoryItem t1 = sog.GetInventoryItem(sog.RootPart.LocalId, i1); 815 TaskInventoryItem t1 = sog.GetInventoryItem(sog.RootPart.LocalId, i1);
816 Assert.That(t1.Name, Is.EqualTo(ib1.Name), "Assert.That(t1.Name, Is.EqualTo(ib1.Name))"); 816 Assert.That(t1.Name, Is.EqualTo(ib1.Name), "Assert.That(t1.Name, Is.EqualTo(ib1.Name))");
diff --git a/OpenSim/Framework/ILandObject.cs b/OpenSim/Framework/ILandObject.cs
index 0316944..f75a990 100644
--- a/OpenSim/Framework/ILandObject.cs
+++ b/OpenSim/Framework/ILandObject.cs
@@ -130,5 +130,11 @@ namespace OpenSim.Framework
130 /// </summary> 130 /// </summary>
131 /// <param name="url"></param> 131 /// <param name="url"></param>
132 void SetMusicUrl(string url); 132 void SetMusicUrl(string url);
133
134 /// <summary>
135 /// Get the music url for this land parcel
136 /// </summary>
137 /// <returns>The music url.</returns>
138 string GetMusicUrl();
133 } 139 }
134} 140}
diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs
index 515567d..c4f7b91 100644
--- a/OpenSim/Region/Application/OpenSim.cs
+++ b/OpenSim/Region/Application/OpenSim.cs
@@ -291,10 +291,10 @@ namespace OpenSim
291 291
292 m_console.Commands.AddCommand("region", false, "save oar", 292 m_console.Commands.AddCommand("region", false, "save oar",
293 //"save oar [-v|--version=<N>] [-p|--profile=<url>] [<OAR path>]", 293 //"save oar [-v|--version=<N>] [-p|--profile=<url>] [<OAR path>]",
294 "save oar [-p|--profile=<url>] [--noassets] [--perm=<permissions>] [<OAR path>]", 294 "save oar [-h|--home=<url>] [--noassets] [--perm=<permissions>] [<OAR path>]",
295 "Save a region's data to an OAR archive.", 295 "Save a region's data to an OAR archive.",
296// "-v|--version=<N> generates scene objects as per older versions of the serialization (e.g. -v=0)" + Environment.NewLine 296// "-v|--version=<N> generates scene objects as per older versions of the serialization (e.g. -v=0)" + Environment.NewLine
297 "-p|--profile=<url> adds the url of the profile service to the saved user information." + Environment.NewLine 297 "-h|--home=<url> adds the url of the profile service to the saved user information." + Environment.NewLine
298 + "--noassets stops assets being saved to the OAR." + Environment.NewLine 298 + "--noassets stops assets being saved to the OAR." + Environment.NewLine
299 + "--perm stops objects with insufficient permissions from being saved to the OAR." + Environment.NewLine 299 + "--perm stops objects with insufficient permissions from being saved to the OAR." + Environment.NewLine
300 + " <permissions> can contain one or more of these characters: \"C\" = Copy, \"T\" = Transfer" + Environment.NewLine 300 + " <permissions> can contain one or more of these characters: \"C\" = Copy, \"T\" = Transfer" + Environment.NewLine
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs
index e0b02aa..150d913 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs
@@ -122,12 +122,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
122 122
123 scene.AddCommand( 123 scene.AddCommand(
124 this, "save iar", 124 this, "save iar",
125 "save iar [--p|-profile=<url>] [--noassets] <first> <last> <inventory path> <password> [<IAR path>] [--v|-verbose]", 125 "save iar [-h|--home=<url>] [--noassets] <first> <last> <inventory path> <password> [<IAR path>] [--v|-verbose]",
126 "Save user inventory archive (IAR).", 126 "Save user inventory archive (IAR).",
127 "<first> is the user's first name." + Environment.NewLine 127 "<first> is the user's first name." + Environment.NewLine
128 + "<last> is the user's last name." + Environment.NewLine 128 + "<last> is the user's last name." + Environment.NewLine
129 + "<inventory path> is the path inside the user's inventory for the folder/item to be saved." + Environment.NewLine 129 + "<inventory path> is the path inside the user's inventory for the folder/item to be saved." + Environment.NewLine
130 + "-p|--profile=<url> adds the url of the profile service to the saved user information." + Environment.NewLine 130 + "-h|--home=<url> adds the url of the profile service to the saved user information." + Environment.NewLine
131 + "-c|--creators preserves information about foreign creators." + Environment.NewLine 131 + "-c|--creators preserves information about foreign creators." + Environment.NewLine
132 + "-v|--verbose extra debug messages." + Environment.NewLine 132 + "-v|--verbose extra debug messages." + Environment.NewLine
133 + "--noassets stops assets being saved to the IAR." 133 + "--noassets stops assets being saved to the IAR."
diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs
index 48f58f0..2d54ed1 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs
@@ -1153,7 +1153,16 @@ namespace OpenSim.Region.CoreModules.World.Land
1153 LandData.MusicURL = url; 1153 LandData.MusicURL = url;
1154 SendLandUpdateToAvatarsOverMe(); 1154 SendLandUpdateToAvatarsOverMe();
1155 } 1155 }
1156 1156
1157 /// <summary>
1158 /// Get the music url for this land parcel
1159 /// </summary>
1160 /// <returns>The music url.</returns>
1161 public string GetMusicUrl()
1162 {
1163 return LandData.MusicURL;
1164 }
1165
1157 #endregion 1166 #endregion
1158 } 1167 }
1159} 1168}
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index e005698..31d9ce59 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1463,7 +1463,7 @@ namespace OpenSim.Region.Framework.Scenes
1463 // If we've found the item in the user's inventory or in the library 1463 // If we've found the item in the user's inventory or in the library
1464 if (item != null) 1464 if (item != null)
1465 { 1465 {
1466 part.ParentGroup.AddInventoryItem(remoteClient, primLocalID, item, copyID); 1466 part.ParentGroup.AddInventoryItem(remoteClient.AgentId, primLocalID, item, copyID);
1467 m_log.InfoFormat( 1467 m_log.InfoFormat(
1468 "[PRIM INVENTORY]: Update with item {0} requested of prim {1} for {2}", 1468 "[PRIM INVENTORY]: Update with item {0} requested of prim {1} for {2}",
1469 item.Name, primLocalID, remoteClient.Name); 1469 item.Name, primLocalID, remoteClient.Name);
@@ -1572,104 +1572,130 @@ namespace OpenSim.Region.Framework.Scenes
1572 /// Rez a script into a prim's inventory, either ex nihilo or from an existing avatar inventory 1572 /// Rez a script into a prim's inventory, either ex nihilo or from an existing avatar inventory
1573 /// </summary> 1573 /// </summary>
1574 /// <param name="remoteClient"></param> 1574 /// <param name="remoteClient"></param>
1575 /// <param name="itemID"> </param> 1575 /// <param name="itemBase"> </param>
1576 /// <param name="transactionID"></param>
1576 /// <param name="localID"></param> 1577 /// <param name="localID"></param>
1577 public void RezScript(IClientAPI remoteClient, InventoryItemBase itemBase, UUID transactionID, uint localID) 1578 public void RezScript(IClientAPI remoteClient, InventoryItemBase itemBase, UUID transactionID, uint localID)
1578 { 1579 {
1579 UUID itemID = itemBase.ID; 1580 SceneObjectPart partWhereRezzed;
1581
1582 if (itemBase.ID != UUID.Zero)
1583 partWhereRezzed = RezScriptFromAgentInventory(remoteClient.AgentId, itemBase.ID, localID);
1584 else
1585 partWhereRezzed = RezNewScript(remoteClient.AgentId, itemBase);
1586
1587 if (partWhereRezzed != null)
1588 partWhereRezzed.SendPropertiesToClient(remoteClient);
1589 }
1590
1591 /// <summary>
1592 /// Rez a script into a prim from an agent inventory.
1593 /// </summary>
1594 /// <param name="agentID"></param>
1595 /// <param name="fromItemID"></param>
1596 /// <param name="localID"></param>
1597 /// <returns>The part where the script was rezzed if successful. False otherwise.</returns>
1598 public SceneObjectPart RezScriptFromAgentInventory(UUID agentID, UUID fromItemID, uint localID)
1599 {
1580 UUID copyID = UUID.Random(); 1600 UUID copyID = UUID.Random();
1601 InventoryItemBase item = new InventoryItemBase(fromItemID, agentID);
1602 item = InventoryService.GetItem(item);
1581 1603
1582 if (itemID != UUID.Zero) // transferred from an avatar inventory to the prim's inventory 1604 // Try library
1605 // XXX clumsy, possibly should be one call
1606 if (null == item && LibraryService != null && LibraryService.LibraryRootFolder != null)
1583 { 1607 {
1584 InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); 1608 item = LibraryService.LibraryRootFolder.FindItem(fromItemID);
1585 item = InventoryService.GetItem(item); 1609 }
1586 1610
1587 // Try library 1611 if (item != null)
1588 // XXX clumsy, possibly should be one call 1612 {
1589 if (null == item && LibraryService != null && LibraryService.LibraryRootFolder != null) 1613 SceneObjectPart part = GetSceneObjectPart(localID);
1614 if (part != null)
1590 { 1615 {
1591 item = LibraryService.LibraryRootFolder.FindItem(itemID); 1616 if (!Permissions.CanEditObjectInventory(part.UUID, agentID))
1592 } 1617 return null;
1593 1618
1594 if (item != null) 1619 part.ParentGroup.AddInventoryItem(agentID, localID, item, copyID);
1595 { 1620 // TODO: switch to posting on_rez here when scripts
1596 SceneObjectPart part = GetSceneObjectPart(localID); 1621 // have state in inventory
1597 if (part != null) 1622 part.Inventory.CreateScriptInstance(copyID, 0, false, DefaultScriptEngine, 0);
1598 {
1599 if (!Permissions.CanEditObjectInventory(part.UUID, remoteClient.AgentId))
1600 return;
1601 1623
1602 part.ParentGroup.AddInventoryItem(remoteClient, localID, item, copyID); 1624 // m_log.InfoFormat("[PRIMINVENTORY]: " +
1603 // TODO: switch to posting on_rez here when scripts 1625 // "Rezzed script {0} into prim local ID {1} for user {2}",
1604 // have state in inventory 1626 // item.inventoryName, localID, remoteClient.Name);
1605 part.Inventory.CreateScriptInstance(copyID, 0, false, DefaultScriptEngine, 0); 1627 part.ParentGroup.ResumeScripts();
1606 1628
1607 // m_log.InfoFormat("[PRIMINVENTORY]: " + 1629 return part;
1608 // "Rezzed script {0} into prim local ID {1} for user {2}",
1609 // item.inventoryName, localID, remoteClient.Name);
1610 part.SendPropertiesToClient(remoteClient);
1611 part.ParentGroup.ResumeScripts();
1612 }
1613 else
1614 {
1615 m_log.ErrorFormat(
1616 "[PRIM INVENTORY]: " +
1617 "Could not rez script {0} into prim local ID {1} for user {2}"
1618 + " because the prim could not be found in the region!",
1619 item.Name, localID, remoteClient.Name);
1620 }
1621 } 1630 }
1622 else 1631 else
1623 { 1632 {
1624 m_log.ErrorFormat( 1633 m_log.ErrorFormat(
1625 "[PRIM INVENTORY]: Could not find script inventory item {0} to rez for {1}!", 1634 "[PRIM INVENTORY]: " +
1626 itemID, remoteClient.Name); 1635 "Could not rez script {0} into prim local ID {1} for user {2}"
1636 + " because the prim could not be found in the region!",
1637 item.Name, localID, agentID);
1627 } 1638 }
1628 } 1639 }
1629 else // script has been rezzed directly into a prim's inventory 1640 else
1630 { 1641 {
1631 SceneObjectPart part = GetSceneObjectPart(itemBase.Folder); 1642 m_log.ErrorFormat(
1632 if (part == null) 1643 "[PRIM INVENTORY]: Could not find script inventory item {0} to rez for {1}!",
1633 return; 1644 fromItemID, agentID);
1645 }
1634 1646
1635 if (!Permissions.CanCreateObjectInventory( 1647 return null;
1636 itemBase.InvType, part.UUID, remoteClient.AgentId)) 1648 }
1637 return;
1638 1649
1639 AssetBase asset = CreateAsset(itemBase.Name, itemBase.Description, (sbyte)itemBase.AssetType, 1650 /// <summary>
1640 Encoding.ASCII.GetBytes("default\n{\n state_entry()\n {\n llSay(0, \"Script running\");\n }\n\n touch_start(integer num)\n {\n }\n}"), 1651 /// Rez a new script from nothing.
1641 remoteClient.AgentId); 1652 /// </summary>
1642 AssetService.Store(asset); 1653 /// <param name="remoteClient"></param>
1654 /// <param name="itemBase"></param>
1655 /// <returns>The part where the script was rezzed if successful. False otherwise.</returns>
1656 public SceneObjectPart RezNewScript(UUID agentID, InventoryItemBase itemBase)
1657 {
1658 // The part ID is the folder ID!
1659 SceneObjectPart part = GetSceneObjectPart(itemBase.Folder);
1660 if (part == null)
1661 return null;
1643 1662
1644 TaskInventoryItem taskItem = new TaskInventoryItem(); 1663 if (!Permissions.CanCreateObjectInventory(itemBase.InvType, part.UUID, agentID))
1645 1664 return null;
1646 taskItem.ResetIDs(itemBase.Folder);
1647 taskItem.ParentID = itemBase.Folder;
1648 taskItem.CreationDate = (uint)itemBase.CreationDate;
1649 taskItem.Name = itemBase.Name;
1650 taskItem.Description = itemBase.Description;
1651 taskItem.Type = itemBase.AssetType;
1652 taskItem.InvType = itemBase.InvType;
1653 taskItem.OwnerID = itemBase.Owner;
1654 taskItem.CreatorID = itemBase.CreatorIdAsUuid;
1655 taskItem.BasePermissions = itemBase.BasePermissions;
1656 taskItem.CurrentPermissions = itemBase.CurrentPermissions;
1657 taskItem.EveryonePermissions = itemBase.EveryOnePermissions;
1658 taskItem.GroupPermissions = itemBase.GroupPermissions;
1659 taskItem.NextPermissions = itemBase.NextPermissions;
1660 taskItem.GroupID = itemBase.GroupID;
1661 taskItem.GroupPermissions = 0;
1662 taskItem.Flags = itemBase.Flags;
1663 taskItem.PermsGranter = UUID.Zero;
1664 taskItem.PermsMask = 0;
1665 taskItem.AssetID = asset.FullID;
1666
1667 part.Inventory.AddInventoryItem(taskItem, false);
1668 part.SendPropertiesToClient(remoteClient);
1669 1665
1670 part.Inventory.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0); 1666 AssetBase asset = CreateAsset(itemBase.Name, itemBase.Description, (sbyte)itemBase.AssetType,
1671 part.ParentGroup.ResumeScripts(); 1667 Encoding.ASCII.GetBytes("default\n{\n state_entry()\n {\n llSay(0, \"Script running\");\n }\n\n touch_start(integer num)\n {\n }\n}"),
1672 } 1668 agentID);
1669 AssetService.Store(asset);
1670
1671 TaskInventoryItem taskItem = new TaskInventoryItem();
1672
1673 taskItem.ResetIDs(itemBase.Folder);
1674 taskItem.ParentID = itemBase.Folder;
1675 taskItem.CreationDate = (uint)itemBase.CreationDate;
1676 taskItem.Name = itemBase.Name;
1677 taskItem.Description = itemBase.Description;
1678 taskItem.Type = itemBase.AssetType;
1679 taskItem.InvType = itemBase.InvType;
1680 taskItem.OwnerID = itemBase.Owner;
1681 taskItem.CreatorID = itemBase.CreatorIdAsUuid;
1682 taskItem.BasePermissions = itemBase.BasePermissions;
1683 taskItem.CurrentPermissions = itemBase.CurrentPermissions;
1684 taskItem.EveryonePermissions = itemBase.EveryOnePermissions;
1685 taskItem.GroupPermissions = itemBase.GroupPermissions;
1686 taskItem.NextPermissions = itemBase.NextPermissions;
1687 taskItem.GroupID = itemBase.GroupID;
1688 taskItem.GroupPermissions = 0;
1689 taskItem.Flags = itemBase.Flags;
1690 taskItem.PermsGranter = UUID.Zero;
1691 taskItem.PermsMask = 0;
1692 taskItem.AssetID = asset.FullID;
1693
1694 part.Inventory.AddInventoryItem(taskItem, false);
1695 part.Inventory.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0);
1696 part.ParentGroup.ResumeScripts();
1697
1698 return part;
1673 } 1699 }
1674 1700
1675 /// <summary> 1701 /// <summary>
@@ -1678,7 +1704,7 @@ namespace OpenSim.Region.Framework.Scenes
1678 /// <param name="remoteClient"></param> 1704 /// <param name="remoteClient"></param>
1679 /// <param name="itemID"> </param> 1705 /// <param name="itemID"> </param>
1680 /// <param name="localID"></param> 1706 /// <param name="localID"></param>
1681 public void RezScript(UUID srcId, SceneObjectPart srcPart, UUID destId, int pin, int running, int start_param) 1707 public void RezScriptFromPrim(UUID srcId, SceneObjectPart srcPart, UUID destId, int pin, int running, int start_param)
1682 { 1708 {
1683 TaskInventoryItem srcTaskItem = srcPart.Inventory.GetInventoryItem(srcId); 1709 TaskInventoryItem srcTaskItem = srcPart.Inventory.GetInventoryItem(srcId);
1684 1710
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
index c7da4f4..b56d3fc 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
@@ -79,13 +79,12 @@ namespace OpenSim.Region.Framework.Scenes
79 /// <summary> 79 /// <summary>
80 /// Add an inventory item from a user's inventory to a prim in this scene object. 80 /// Add an inventory item from a user's inventory to a prim in this scene object.
81 /// </summary> 81 /// </summary>
82 /// <param name="remoteClient">The client adding the item.</param> 82 /// <param name="agentID">The agent adding the item.</param>
83 /// <param name="localID">The local ID of the part receiving the add.</param> 83 /// <param name="localID">The local ID of the part receiving the add.</param>
84 /// <param name="item">The user inventory item being added.</param> 84 /// <param name="item">The user inventory item being added.</param>
85 /// <param name="copyItemID">The item UUID that should be used by the new item.</param> 85 /// <param name="copyItemID">The item UUID that should be used by the new item.</param>
86 /// <returns></returns> 86 /// <returns></returns>
87 public bool AddInventoryItem(IClientAPI remoteClient, uint localID, 87 public bool AddInventoryItem(UUID agentID, uint localID, InventoryItemBase item, UUID copyItemID)
88 InventoryItemBase item, UUID copyItemID)
89 { 88 {
90// m_log.DebugFormat( 89// m_log.DebugFormat(
91// "[PRIM INVENTORY]: Adding inventory item {0} from {1} to part with local ID {2}", 90// "[PRIM INVENTORY]: Adding inventory item {0} from {1} to part with local ID {2}",
@@ -107,9 +106,7 @@ namespace OpenSim.Region.Framework.Scenes
107 taskItem.Type = item.AssetType; 106 taskItem.Type = item.AssetType;
108 taskItem.InvType = item.InvType; 107 taskItem.InvType = item.InvType;
109 108
110 if (remoteClient != null && 109 if (agentID != part.OwnerID && m_scene.Permissions.PropagatePermissions())
111 remoteClient.AgentId != part.OwnerID &&
112 m_scene.Permissions.PropagatePermissions())
113 { 110 {
114 taskItem.BasePermissions = item.BasePermissions & 111 taskItem.BasePermissions = item.BasePermissions &
115 item.NextPermissions; 112 item.NextPermissions;
@@ -144,11 +141,7 @@ namespace OpenSim.Region.Framework.Scenes
144// taskItem.SaleType = item.SaleType; 141// taskItem.SaleType = item.SaleType;
145 taskItem.CreationDate = (uint)item.CreationDate; 142 taskItem.CreationDate = (uint)item.CreationDate;
146 143
147 bool addFromAllowedDrop = false; 144 bool addFromAllowedDrop = agentID != part.OwnerID;
148 if (remoteClient != null)
149 {
150 addFromAllowedDrop = remoteClient.AgentId != part.OwnerID;
151 }
152 145
153 part.Inventory.AddInventoryItem(taskItem, addFromAllowedDrop); 146 part.Inventory.AddInventoryItem(taskItem, addFromAllowedDrop);
154 147
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
index 7704002..e9a849c 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
@@ -72,6 +72,8 @@ public class BSScene : PhysicsScene, IPhysicsParameters
72 72
73 private bool m_initialized = false; 73 private bool m_initialized = false;
74 74
75 private int m_detailedStatsStep = 0;
76
75 public IMesher mesher; 77 public IMesher mesher;
76 private float m_meshLOD; 78 private float m_meshLOD;
77 public float MeshLOD 79 public float MeshLOD
@@ -192,6 +194,8 @@ public class BSScene : PhysicsScene, IPhysicsParameters
192 m_meshLOD = 8f; 194 m_meshLOD = 8f;
193 m_sculptLOD = 32f; 195 m_sculptLOD = 32f;
194 196
197 m_detailedStatsStep = 0; // disabled
198
195 m_maxSubSteps = 10; 199 m_maxSubSteps = 10;
196 m_fixedTimeStep = 1f / 60f; 200 m_fixedTimeStep = 1f / 60f;
197 m_maxCollisionsPerFrame = 2048; 201 m_maxCollisionsPerFrame = 2048;
@@ -209,8 +213,9 @@ public class BSScene : PhysicsScene, IPhysicsParameters
209 parms.deactivationTime = 0.2f; 213 parms.deactivationTime = 0.2f;
210 parms.linearSleepingThreshold = 0.8f; 214 parms.linearSleepingThreshold = 0.8f;
211 parms.angularSleepingThreshold = 1.0f; 215 parms.angularSleepingThreshold = 1.0f;
212 parms.ccdMotionThreshold = 0.5f; // set to zero to disable 216 parms.ccdMotionThreshold = 0.0f; // set to zero to disable
213 parms.ccdSweptSphereRadius = 0.2f; 217 parms.ccdSweptSphereRadius = 0.0f;
218 parms.contactProcessingThreshold = 0.1f;
214 219
215 parms.terrainFriction = 0.5f; 220 parms.terrainFriction = 0.5f;
216 parms.terrainHitFraction = 0.8f; 221 parms.terrainHitFraction = 0.8f;
@@ -231,6 +236,7 @@ public class BSScene : PhysicsScene, IPhysicsParameters
231 _meshSculptedPrim = pConfig.GetBoolean("MeshSculptedPrim", _meshSculptedPrim); 236 _meshSculptedPrim = pConfig.GetBoolean("MeshSculptedPrim", _meshSculptedPrim);
232 _forceSimplePrimMeshing = pConfig.GetBoolean("ForceSimplePrimMeshing", _forceSimplePrimMeshing); 237 _forceSimplePrimMeshing = pConfig.GetBoolean("ForceSimplePrimMeshing", _forceSimplePrimMeshing);
233 238
239 m_detailedStatsStep = pConfig.GetInt("DetailedStatsStep", m_detailedStatsStep);
234 m_meshLOD = pConfig.GetFloat("MeshLevelOfDetail", m_meshLOD); 240 m_meshLOD = pConfig.GetFloat("MeshLevelOfDetail", m_meshLOD);
235 m_sculptLOD = pConfig.GetFloat("SculptLevelOfDetail", m_sculptLOD); 241 m_sculptLOD = pConfig.GetFloat("SculptLevelOfDetail", m_sculptLOD);
236 242
@@ -253,6 +259,7 @@ public class BSScene : PhysicsScene, IPhysicsParameters
253 parms.angularSleepingThreshold = pConfig.GetFloat("AngularSleepingThreshold", parms.angularSleepingThreshold); 259 parms.angularSleepingThreshold = pConfig.GetFloat("AngularSleepingThreshold", parms.angularSleepingThreshold);
254 parms.ccdMotionThreshold = pConfig.GetFloat("CcdMotionThreshold", parms.ccdMotionThreshold); 260 parms.ccdMotionThreshold = pConfig.GetFloat("CcdMotionThreshold", parms.ccdMotionThreshold);
255 parms.ccdSweptSphereRadius = pConfig.GetFloat("CcdSweptSphereRadius", parms.ccdSweptSphereRadius); 261 parms.ccdSweptSphereRadius = pConfig.GetFloat("CcdSweptSphereRadius", parms.ccdSweptSphereRadius);
262 parms.contactProcessingThreshold = pConfig.GetFloat("ContactProcessingThreshold", parms.contactProcessingThreshold);
256 263
257 parms.terrainFriction = pConfig.GetFloat("TerrainFriction", parms.terrainFriction); 264 parms.terrainFriction = pConfig.GetFloat("TerrainFriction", parms.terrainFriction);
258 parms.terrainHitFraction = pConfig.GetFloat("TerrainHitFraction", parms.terrainHitFraction); 265 parms.terrainHitFraction = pConfig.GetFloat("TerrainHitFraction", parms.terrainHitFraction);
@@ -398,6 +405,14 @@ public class BSScene : PhysicsScene, IPhysicsParameters
398 } 405 }
399 } 406 }
400 407
408 if (m_detailedStatsStep > 0)
409 {
410 if ((m_simulationStep % m_detailedStatsStep) == 0)
411 {
412 BulletSimAPI.DumpBulletStatistics();
413 }
414 }
415
401 // TODO: FIX THIS: fps calculation wrong. This calculation always returns about 1 in normal operation. 416 // TODO: FIX THIS: fps calculation wrong. This calculation always returns about 1 in normal operation.
402 return timeStep / (numSubSteps * m_fixedTimeStep) * 1000f; 417 return timeStep / (numSubSteps * m_fixedTimeStep) * 1000f;
403 } 418 }
@@ -671,6 +686,7 @@ public class BSScene : PhysicsScene, IPhysicsParameters
671 new PhysParameterEntry("MaxSubStep", "In simulation step, maximum number of substeps"), 686 new PhysParameterEntry("MaxSubStep", "In simulation step, maximum number of substeps"),
672 new PhysParameterEntry("FixedTimeStep", "In simulation step, seconds of one substep (1/60)"), 687 new PhysParameterEntry("FixedTimeStep", "In simulation step, seconds of one substep (1/60)"),
673 new PhysParameterEntry("MaxObjectMass", "Maximum object mass (10000.01)"), 688 new PhysParameterEntry("MaxObjectMass", "Maximum object mass (10000.01)"),
689 new PhysParameterEntry("DetailedStats", "Frames between outputting detailed phys stats. Zero is off"),
674 690
675 new PhysParameterEntry("DefaultFriction", "Friction factor used on new objects"), 691 new PhysParameterEntry("DefaultFriction", "Friction factor used on new objects"),
676 new PhysParameterEntry("DefaultDensity", "Density for new objects" ), 692 new PhysParameterEntry("DefaultDensity", "Density for new objects" ),
@@ -685,6 +701,7 @@ public class BSScene : PhysicsScene, IPhysicsParameters
685 new PhysParameterEntry("AngularSleepingThreshold", "Seconds to measure angular movement before considering static" ), 701 new PhysParameterEntry("AngularSleepingThreshold", "Seconds to measure angular movement before considering static" ),
686 // new PhysParameterEntry("CcdMotionThreshold", "" ), 702 // new PhysParameterEntry("CcdMotionThreshold", "" ),
687 // new PhysParameterEntry("CcdSweptSphereRadius", "" ), 703 // new PhysParameterEntry("CcdSweptSphereRadius", "" ),
704 new PhysParameterEntry("ContactProcessingThreshold", "Distance between contacts before doing collision check" ),
688 705
689 new PhysParameterEntry("TerrainFriction", "Factor to reduce movement against terrain surface" ), 706 new PhysParameterEntry("TerrainFriction", "Factor to reduce movement against terrain surface" ),
690 new PhysParameterEntry("TerrainHitFraction", "Distance to measure hit collisions" ), 707 new PhysParameterEntry("TerrainHitFraction", "Distance to measure hit collisions" ),
@@ -715,6 +732,7 @@ public class BSScene : PhysicsScene, IPhysicsParameters
715 string lparm = parm.ToLower(); 732 string lparm = parm.ToLower();
716 switch (lparm) 733 switch (lparm)
717 { 734 {
735 case "detailedstats": m_detailedStatsStep = (int)val; break;
718 case "meshlod": m_meshLOD = (int)val; break; 736 case "meshlod": m_meshLOD = (int)val; break;
719 case "sculptlod": m_sculptLOD = (int)val; break; 737 case "sculptlod": m_sculptLOD = (int)val; break;
720 case "maxsubstep": m_maxSubSteps = (int)val; break; 738 case "maxsubstep": m_maxSubSteps = (int)val; break;
@@ -725,7 +743,7 @@ public class BSScene : PhysicsScene, IPhysicsParameters
725 case "defaultdensity": m_params[0].defaultDensity = val; break; 743 case "defaultdensity": m_params[0].defaultDensity = val; break;
726 case "defaultrestitution": m_params[0].defaultRestitution = val; break; 744 case "defaultrestitution": m_params[0].defaultRestitution = val; break;
727 case "collisionmargin": m_params[0].collisionMargin = val; break; 745 case "collisionmargin": m_params[0].collisionMargin = val; break;
728 case "gravity": m_params[0].gravity = val; TaintedUpdateParameter(lparm, PhysParameterEntry.APPLY_TO_NONE, val); break; 746 case "gravity": m_params[0].gravity = val; TaintedUpdateParameter(lparm, PhysParameterEntry.APPLY_TO_NONE, val); break;
729 747
730 case "lineardamping": UpdateParameterPrims(ref m_params[0].linearDamping, lparm, localID, val); break; 748 case "lineardamping": UpdateParameterPrims(ref m_params[0].linearDamping, lparm, localID, val); break;
731 case "angulardamping": UpdateParameterPrims(ref m_params[0].angularDamping, lparm, localID, val); break; 749 case "angulardamping": UpdateParameterPrims(ref m_params[0].angularDamping, lparm, localID, val); break;
@@ -734,6 +752,7 @@ public class BSScene : PhysicsScene, IPhysicsParameters
734 case "angularsleepingthreshold": UpdateParameterPrims(ref m_params[0].angularDamping, lparm, localID, val); break; 752 case "angularsleepingthreshold": UpdateParameterPrims(ref m_params[0].angularDamping, lparm, localID, val); break;
735 case "ccdmotionthreshold": UpdateParameterPrims(ref m_params[0].ccdMotionThreshold, lparm, localID, val); break; 753 case "ccdmotionthreshold": UpdateParameterPrims(ref m_params[0].ccdMotionThreshold, lparm, localID, val); break;
736 case "ccdsweptsphereradius": UpdateParameterPrims(ref m_params[0].ccdSweptSphereRadius, lparm, localID, val); break; 754 case "ccdsweptsphereradius": UpdateParameterPrims(ref m_params[0].ccdSweptSphereRadius, lparm, localID, val); break;
755 case "contactprocessingthreshold": UpdateParameterPrims(ref m_params[0].contactProcessingThreshold, lparm, localID, val); break;
737 756
738 // set a terrain physical feature and cause terrain to be recalculated 757 // set a terrain physical feature and cause terrain to be recalculated
739 case "terrainfriction": m_params[0].terrainFriction = val; TaintedUpdateParameter("terrain", 0, val); break; 758 case "terrainfriction": m_params[0].terrainFriction = val; TaintedUpdateParameter("terrain", 0, val); break;
@@ -741,10 +760,10 @@ public class BSScene : PhysicsScene, IPhysicsParameters
741 case "terrainrestitution": m_params[0].terrainRestitution = val; TaintedUpdateParameter("terrain", 0, val); break; 760 case "terrainrestitution": m_params[0].terrainRestitution = val; TaintedUpdateParameter("terrain", 0, val); break;
742 // set an avatar physical feature and cause avatar(s) to be recalculated 761 // set an avatar physical feature and cause avatar(s) to be recalculated
743 case "avatarfriction": UpdateParameterAvatars(ref m_params[0].avatarFriction, "avatar", localID, val); break; 762 case "avatarfriction": UpdateParameterAvatars(ref m_params[0].avatarFriction, "avatar", localID, val); break;
744 case "avatardensity": UpdateParameterAvatars(ref m_params[0].avatarDensity, "avatar", localID, val); break; 763 case "avatardensity": UpdateParameterAvatars(ref m_params[0].avatarDensity, "avatar", localID, val); break;
745 case "avatarrestitution": UpdateParameterAvatars(ref m_params[0].avatarRestitution, "avatar", localID, val); break; 764 case "avatarrestitution": UpdateParameterAvatars(ref m_params[0].avatarRestitution, "avatar", localID, val); break;
746 case "avatarcapsuleradius": UpdateParameterAvatars(ref m_params[0].avatarCapsuleRadius, "avatar", localID, val); break; 765 case "avatarcapsuleradius": UpdateParameterAvatars(ref m_params[0].avatarCapsuleRadius, "avatar", localID, val); break;
747 case "avatarcapsuleheight": UpdateParameterAvatars(ref m_params[0].avatarCapsuleHeight, "avatar", localID, val); break; 766 case "avatarcapsuleheight": UpdateParameterAvatars(ref m_params[0].avatarCapsuleHeight, "avatar", localID, val); break;
748 767
749 default: ret = false; break; 768 default: ret = false; break;
750 } 769 }
@@ -816,6 +835,7 @@ public class BSScene : PhysicsScene, IPhysicsParameters
816 bool ret = true; 835 bool ret = true;
817 switch (parm.ToLower()) 836 switch (parm.ToLower())
818 { 837 {
838 case "detailedstats": val = (int)m_detailedStatsStep; break;
819 case "meshlod": val = (float)m_meshLOD; break; 839 case "meshlod": val = (float)m_meshLOD; break;
820 case "sculptlod": val = (float)m_sculptLOD; break; 840 case "sculptlod": val = (float)m_sculptLOD; break;
821 case "maxsubstep": val = (float)m_maxSubSteps; break; 841 case "maxsubstep": val = (float)m_maxSubSteps; break;
@@ -835,6 +855,7 @@ public class BSScene : PhysicsScene, IPhysicsParameters
835 case "angularsleepingthreshold": val = m_params[0].angularDamping; break; 855 case "angularsleepingthreshold": val = m_params[0].angularDamping; break;
836 case "ccdmotionthreshold": val = m_params[0].ccdMotionThreshold; break; 856 case "ccdmotionthreshold": val = m_params[0].ccdMotionThreshold; break;
837 case "ccdsweptsphereradius": val = m_params[0].ccdSweptSphereRadius; break; 857 case "ccdsweptsphereradius": val = m_params[0].ccdSweptSphereRadius; break;
858 case "contactprocessingthreshold": val = m_params[0].contactProcessingThreshold; break;
838 859
839 case "terrainfriction": val = m_params[0].terrainFriction; break; 860 case "terrainfriction": val = m_params[0].terrainFriction; break;
840 case "terrainhitfraction": val = m_params[0].terrainHitFraction; break; 861 case "terrainhitfraction": val = m_params[0].terrainHitFraction; break;
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs b/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs
index a610c8d..d12bd7d 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs
@@ -122,6 +122,7 @@ public struct ConfigurationParameters
122 public float angularSleepingThreshold; 122 public float angularSleepingThreshold;
123 public float ccdMotionThreshold; 123 public float ccdMotionThreshold;
124 public float ccdSweptSphereRadius; 124 public float ccdSweptSphereRadius;
125 public float contactProcessingThreshold;
125 126
126 public float terrainFriction; 127 public float terrainFriction;
127 public float terrainHitFraction; 128 public float terrainHitFraction;
@@ -248,6 +249,9 @@ public static extern RaycastHit RayTest(uint worldID, uint id, Vector3 from, Vec
248[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] 249[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
249public static extern Vector3 RecoverFromPenetration(uint worldID, uint id); 250public static extern Vector3 RecoverFromPenetration(uint worldID, uint id);
250 251
252[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
253public static extern void DumpBulletStatistics();
254
251// Log a debug message 255// Log a debug message
252[UnmanagedFunctionPointer(CallingConvention.Cdecl)] 256[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
253public delegate void DebugLogCallback([MarshalAs(UnmanagedType.LPStr)]string msg); 257public delegate void DebugLogCallback([MarshalAs(UnmanagedType.LPStr)]string msg);
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
index c6e8286..7c1c046 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
@@ -1048,6 +1048,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1048 CAPSULE_RADIUS = 0.01f; 1048 CAPSULE_RADIUS = 0.01f;
1049 } 1049 }
1050 1050
1051// lock (OdeScene.UniversalColliderSyncObject)
1051 Shell = d.CreateCapsule(_parent_scene.space, CAPSULE_RADIUS, CAPSULE_LENGTH); 1052 Shell = d.CreateCapsule(_parent_scene.space, CAPSULE_RADIUS, CAPSULE_LENGTH);
1052 1053
1053 d.GeomSetCategoryBits(Shell, (int)m_collisionCategories); 1054 d.GeomSetCategoryBits(Shell, (int)m_collisionCategories);
@@ -1179,7 +1180,9 @@ namespace OpenSim.Region.Physics.OdePlugin
1179 1180
1180 if (Shell != IntPtr.Zero) 1181 if (Shell != IntPtr.Zero)
1181 { 1182 {
1183// lock (OdeScene.UniversalColliderSyncObject)
1182 d.GeomDestroy(Shell); 1184 d.GeomDestroy(Shell);
1185
1183 _parent_scene.geom_name_map.Remove(Shell); 1186 _parent_scene.geom_name_map.Remove(Shell);
1184 _parent_scene.actor_name_map.Remove(Shell); 1187 _parent_scene.actor_name_map.Remove(Shell);
1185 1188
diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs
index 37daf46..4530c09 100644
--- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs
+++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs
@@ -105,6 +105,32 @@ namespace OpenSim.Region.Physics.OdePlugin
105 private readonly ILog m_log; 105 private readonly ILog m_log;
106 // private Dictionary<string, sCollisionData> m_storedCollisions = new Dictionary<string, sCollisionData>(); 106 // private Dictionary<string, sCollisionData> m_storedCollisions = new Dictionary<string, sCollisionData>();
107 107
108 /// <summary>
109 /// Provide a sync object so that only one thread calls d.Collide() at a time across all OdeScene instances.
110 /// </summary>
111 /// <remarks>
112 /// With ODE as of r1755 (though also tested on r1860), only one thread can call d.Collide() at a
113 /// time, even where physics objects are in entirely different ODE worlds. This is because generating contacts
114 /// uses a static cache at the ODE level.
115 ///
116 /// Without locking, simulators running multiple regions will eventually crash with a native stack trace similar
117 /// to
118 ///
119 /// mono() [0x489171]
120 /// mono() [0x4d154f]
121 /// /lib/x86_64-linux-gnu/libpthread.so.0(+0xfc60) [0x7f6ded592c60]
122 /// .../opensim/bin/libode-x86_64.so(_ZN6Opcode11OBBCollider8_CollideEPKNS_14AABBNoLeafNodeE+0xd7a) [0x7f6dd822628a]
123 ///
124 /// ODE provides an experimental option to cache in thread local storage but compiling ODE with this option
125 /// causes OpenSimulator to immediately crash with a native stack trace similar to
126 ///
127 /// mono() [0x489171]
128 /// mono() [0x4d154f]
129 /// /lib/x86_64-linux-gnu/libpthread.so.0(+0xfc60) [0x7f03c9849c60]
130 /// .../opensim/bin/libode-x86_64.so(_Z12dCollideCCTLP6dxGeomS0_iP12dContactGeomi+0x92) [0x7f03b44bcf82]
131 /// </remarks>
132 internal static Object UniversalColliderSyncObject = new Object();
133
108 private Random fluidRandomizer = new Random(Environment.TickCount); 134 private Random fluidRandomizer = new Random(Environment.TickCount);
109 135
110 private const uint m_regionWidth = Constants.RegionSize; 136 private const uint m_regionWidth = Constants.RegionSize;
@@ -799,7 +825,9 @@ namespace OpenSim.Region.Physics.OdePlugin
799 if (b1 != IntPtr.Zero && b2 != IntPtr.Zero && d.AreConnectedExcluding(b1, b2, d.JointType.Contact)) 825 if (b1 != IntPtr.Zero && b2 != IntPtr.Zero && d.AreConnectedExcluding(b1, b2, d.JointType.Contact))
800 return; 826 return;
801 827
802 count = d.Collide(g1, g2, contacts.Length, contacts, d.ContactGeom.SizeOf); 828 lock (OdeScene.UniversalColliderSyncObject)
829 count = d.Collide(g1, g2, contacts.Length, contacts, d.ContactGeom.SizeOf);
830
803 if (count > contacts.Length) 831 if (count > contacts.Length)
804 m_log.Error("[ODE SCENE]: Got " + count + " contacts when we asked for a maximum of " + contacts.Length); 832 m_log.Error("[ODE SCENE]: Got " + count + " contacts when we asked for a maximum of " + contacts.Length);
805 } 833 }
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index fda4772..23e3e15 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -7003,7 +7003,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7003 if ((scriptItem.BasePermissions & (uint)PermissionMask.Transfer) != 0 || dest.ParentGroup.RootPart.OwnerID == m_host.ParentGroup.RootPart.OwnerID) 7003 if ((scriptItem.BasePermissions & (uint)PermissionMask.Transfer) != 0 || dest.ParentGroup.RootPart.OwnerID == m_host.ParentGroup.RootPart.OwnerID)
7004 { 7004 {
7005 // the rest of the permission checks are done in RezScript, so check the pin there as well 7005 // the rest of the permission checks are done in RezScript, so check the pin there as well
7006 World.RezScript(srcId, m_host, destId, pin, running, start_param); 7006 World.RezScriptFromPrim(srcId, m_host, destId, pin, running, start_param);
7007 7007
7008 if ((scriptItem.BasePermissions & (uint)PermissionMask.Copy) == 0) 7008 if ((scriptItem.BasePermissions & (uint)PermissionMask.Copy) == 0)
7009 m_host.Inventory.RemoveInventoryItem(srcId); 7009 m_host.Inventory.RemoveInventoryItem(srcId);
@@ -8065,6 +8065,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8065 ScriptSleep(2000); 8065 ScriptSleep(2000);
8066 } 8066 }
8067 8067
8068 public LSL_String llGetParcelMusicURL()
8069 {
8070 m_host.AddScriptLPS(1);
8071
8072 ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y);
8073
8074 if (land.LandData.OwnerID != m_host.OwnerID)
8075 return String.Empty;
8076
8077 return land.GetMusicUrl();
8078 }
8079
8068 public LSL_Vector llGetRootPosition() 8080 public LSL_Vector llGetRootPosition()
8069 { 8081 {
8070 m_host.AddScriptLPS(1); 8082 m_host.AddScriptLPS(1);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs
index e0027b2..f4de93e 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs
@@ -162,6 +162,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
162 LSL_List llGetParcelDetails(LSL_Vector pos, LSL_List param); 162 LSL_List llGetParcelDetails(LSL_Vector pos, LSL_List param);
163 LSL_Integer llGetParcelFlags(LSL_Vector pos); 163 LSL_Integer llGetParcelFlags(LSL_Vector pos);
164 LSL_Integer llGetParcelMaxPrims(LSL_Vector pos, int sim_wide); 164 LSL_Integer llGetParcelMaxPrims(LSL_Vector pos, int sim_wide);
165 LSL_String llGetParcelMusicURL();
165 LSL_Integer llGetParcelPrimCount(LSL_Vector pos, int category, int sim_wide); 166 LSL_Integer llGetParcelPrimCount(LSL_Vector pos, int category, int sim_wide);
166 LSL_List llGetParcelPrimOwners(LSL_Vector pos); 167 LSL_List llGetParcelPrimOwners(LSL_Vector pos);
167 LSL_Integer llGetPermissions(); 168 LSL_Integer llGetPermissions();
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs
index 231cd7e..e0c81c7 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs
@@ -661,6 +661,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
661 return m_LSL_Functions.llGetParcelMaxPrims(pos, sim_wide); 661 return m_LSL_Functions.llGetParcelMaxPrims(pos, sim_wide);
662 } 662 }
663 663
664 public LSL_String llGetParcelMusicURL()
665 {
666 return m_LSL_Functions.llGetParcelMusicURL();
667 }
668
664 public LSL_Integer llGetParcelPrimCount(LSL_Vector pos, int category, int sim_wide) 669 public LSL_Integer llGetParcelPrimCount(LSL_Vector pos, int category, int sim_wide)
665 { 670 {
666 return m_LSL_Functions.llGetParcelPrimCount(pos, category, sim_wide); 671 return m_LSL_Functions.llGetParcelPrimCount(pos, category, sim_wide);
diff --git a/OpenSim/Region/UserStatistics/WebStatsModule.cs b/OpenSim/Region/UserStatistics/WebStatsModule.cs
index fca9fd0..24a9418 100644
--- a/OpenSim/Region/UserStatistics/WebStatsModule.cs
+++ b/OpenSim/Region/UserStatistics/WebStatsModule.cs
@@ -442,7 +442,7 @@ namespace OpenSim.Region.UserStatistics
442 public string ViewerStatsReport(string request, string path, string param, 442 public string ViewerStatsReport(string request, string path, string param,
443 UUID agentID, Caps caps) 443 UUID agentID, Caps caps)
444 { 444 {
445 //m_log.Debug(request); 445// m_log.DebugFormat("[WEB STATS MODULE]: Received viewer starts report from {0}", agentID);
446 446
447 UpdateUserStats(ParseViewerStats(request,agentID), dbConn); 447 UpdateUserStats(ParseViewerStats(request,agentID), dbConn);
448 448
@@ -655,13 +655,13 @@ namespace OpenSim.Region.UserStatistics
655 updatecmd.Parameters.Add(new SqliteParameter(":session_key", uid.session_data.session_id.ToString())); 655 updatecmd.Parameters.Add(new SqliteParameter(":session_key", uid.session_data.session_id.ToString()));
656 updatecmd.Parameters.Add(new SqliteParameter(":agent_key", uid.session_data.agent_id.ToString())); 656 updatecmd.Parameters.Add(new SqliteParameter(":agent_key", uid.session_data.agent_id.ToString()));
657 updatecmd.Parameters.Add(new SqliteParameter(":region_key", uid.session_data.region_id.ToString())); 657 updatecmd.Parameters.Add(new SqliteParameter(":region_key", uid.session_data.region_id.ToString()));
658 m_log.Debug("UPDATE"); 658// m_log.Debug("UPDATE");
659 659
660 int result = updatecmd.ExecuteNonQuery(); 660 int result = updatecmd.ExecuteNonQuery();
661 661
662 if (result == 0) 662 if (result == 0)
663 { 663 {
664 m_log.Debug("INSERT"); 664// m_log.Debug("INSERT");
665 updatecmd.CommandText = SQL_STATS_TABLE_INSERT; 665 updatecmd.CommandText = SQL_STATS_TABLE_INSERT;
666 try 666 try
667 { 667 {