diff --git a/OpenSim/Data/Resources/OpenSim.Data.addin.xml b/OpenSim/Data/Resources/OpenSim.Data.addin.xml
index 65774ffc4f..10c9c3cb28 100644
--- a/OpenSim/Data/Resources/OpenSim.Data.addin.xml
+++ b/OpenSim/Data/Resources/OpenSim.Data.addin.xml
@@ -3,19 +3,10 @@
-
-
-
-
-
-
-
-
-
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
index c8697fe614..31dfe145f5 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
@@ -93,37 +93,37 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
///
public List Execute()
{
- string filePath = "ERROR";
- int successfulAssetRestores = 0;
- int failedAssetRestores = 0;
- int successfulItemRestores = 0;
-
- List loadedNodes = new List();
-
- List folderCandidates
- = InventoryArchiveUtils.FindFolderByPath(
- m_scene.InventoryService, m_userInfo.PrincipalID, m_invPath);
-
- if (folderCandidates.Count == 0)
- {
- // Possibly provide an option later on to automatically create this folder if it does not exist
- m_log.ErrorFormat("[INVENTORY ARCHIVER]: Inventory path {0} does not exist", m_invPath);
-
- return loadedNodes;
- }
-
- InventoryFolderBase rootDestinationFolder = folderCandidates[0];
- archive = new TarArchiveReader(m_loadStream);
-
- // In order to load identically named folders, we need to keep track of the folders that we have already
- // resolved
- Dictionary resolvedFolders = new Dictionary();
-
- byte[] data;
- TarArchiveReader.TarEntryType entryType;
-
try
{
+ string filePath = "ERROR";
+ int successfulAssetRestores = 0;
+ int failedAssetRestores = 0;
+ int successfulItemRestores = 0;
+
+ List loadedNodes = new List();
+
+ List folderCandidates
+ = InventoryArchiveUtils.FindFolderByPath(
+ m_scene.InventoryService, m_userInfo.PrincipalID, m_invPath);
+
+ if (folderCandidates.Count == 0)
+ {
+ // Possibly provide an option later on to automatically create this folder if it does not exist
+ m_log.ErrorFormat("[INVENTORY ARCHIVER]: Inventory path {0} does not exist", m_invPath);
+
+ return loadedNodes;
+ }
+
+ InventoryFolderBase rootDestinationFolder = folderCandidates[0];
+ archive = new TarArchiveReader(m_loadStream);
+
+ // In order to load identically named folders, we need to keep track of the folders that we have already
+ // resolved
+ Dictionary resolvedFolders = new Dictionary();
+
+ byte[] data;
+ TarArchiveReader.TarEntryType entryType;
+
while ((data = archive.ReadEntry(out filePath, out entryType)) != null)
{
if (filePath.StartsWith(ArchiveConstants.ASSETS_PATH))
@@ -166,18 +166,20 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
}
}
}
+
+ archive.Close();
+
+ m_log.DebugFormat(
+ "[INVENTORY ARCHIVER]: Successfully loaded {0} assets with {1} failures",
+ successfulAssetRestores, failedAssetRestores);
+ m_log.InfoFormat("[INVENTORY ARCHIVER]: Successfully loaded {0} items", successfulItemRestores);
+
+ return loadedNodes;
}
finally
{
- archive.Close();
- }
-
- m_log.DebugFormat(
- "[INVENTORY ARCHIVER]: Successfully loaded {0} assets with {1} failures",
- successfulAssetRestores, failedAssetRestores);
- m_log.InfoFormat("[INVENTORY ARCHIVER]: Successfully loaded {0} items", successfulItemRestores);
-
- return loadedNodes;
+ m_loadStream.Close();
+ }
}
public void Close()
@@ -247,7 +249,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
ref string archivePath,
Dictionary resolvedFolders)
{
- string originalArchivePath = archivePath;
+// string originalArchivePath = archivePath;
InventoryFolderBase destFolder = null;
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs
index 2c2724e74c..25a78ff618 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs
@@ -119,22 +119,24 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
protected void ReceivedAllAssets(ICollection assetsFoundUuids, ICollection assetsNotFoundUuids)
{
Exception reportedException = null;
- bool succeeded = true;
-
+ bool succeeded = true;
+
try
{
// We're almost done. Just need to write out the control file now
m_archiveWriter.WriteFile(ArchiveConstants.CONTROL_FILE_PATH, Create0p1ControlFile());
m_log.InfoFormat("[ARCHIVER]: Added control file to archive.");
-
m_archiveWriter.Close();
}
catch (Exception e)
{
- m_saveStream.Close();
reportedException = e;
succeeded = false;
}
+ finally
+ {
+ m_saveStream.Close();
+ }
m_module.TriggerInventoryArchiveSaved(
m_id, succeeded, m_userInfo, m_invPath, m_saveStream, reportedException);
@@ -213,70 +215,68 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
///
public void Execute()
{
- InventoryFolderBase inventoryFolder = null;
- InventoryItemBase inventoryItem = null;
- InventoryFolderBase rootFolder = m_scene.InventoryService.GetRootFolder(m_userInfo.PrincipalID);
-
- bool foundStar = false;
-
- // Eliminate double slashes and any leading / on the path.
- string[] components
- = m_invPath.Split(
- new string[] { InventoryFolderImpl.PATH_DELIMITER }, StringSplitOptions.RemoveEmptyEntries);
-
- int maxComponentIndex = components.Length - 1;
-
- // If the path terminates with a STAR then later on we want to archive all nodes in the folder but not the
- // folder itself. This may get more sophisicated later on
- if (maxComponentIndex >= 0 && components[maxComponentIndex] == STAR_WILDCARD)
- {
- foundStar = true;
- maxComponentIndex--;
- }
-
- m_invPath = String.Empty;
- for (int i = 0; i <= maxComponentIndex; i++)
- {
- m_invPath += components[i] + InventoryFolderImpl.PATH_DELIMITER;
- }
-
- // Annoyingly Split actually returns the original string if the input string consists only of delimiters
- // Therefore if we still start with a / after the split, then we need the root folder
- if (m_invPath.Length == 0)
- {
- inventoryFolder = rootFolder;
- }
- else
- {
- m_invPath = m_invPath.Remove(m_invPath.LastIndexOf(InventoryFolderImpl.PATH_DELIMITER));
- List candidateFolders
- = InventoryArchiveUtils.FindFolderByPath(m_scene.InventoryService, rootFolder, m_invPath);
- if (candidateFolders.Count > 0)
- inventoryFolder = candidateFolders[0];
- }
-
- // The path may point to an item instead
- if (inventoryFolder == null)
- {
- inventoryItem = InventoryArchiveUtils.FindItemByPath(m_scene.InventoryService, rootFolder, m_invPath);
- //inventoryItem = m_userInfo.RootFolder.FindItemByPath(m_invPath);
- }
-
- if (null == inventoryFolder && null == inventoryItem)
- {
- // We couldn't find the path indicated
- string errorMessage = string.Format("Aborted save. Could not find inventory path {0}", m_invPath);
- m_log.ErrorFormat("[INVENTORY ARCHIVER]: {0}", errorMessage);
- m_module.TriggerInventoryArchiveSaved(
- m_id, false, m_userInfo, m_invPath, m_saveStream,
- new Exception(errorMessage));
- return;
- }
-
- m_archiveWriter = new TarArchiveWriter(m_saveStream);
-
try
{
+ InventoryFolderBase inventoryFolder = null;
+ InventoryItemBase inventoryItem = null;
+ InventoryFolderBase rootFolder = m_scene.InventoryService.GetRootFolder(m_userInfo.PrincipalID);
+
+ bool foundStar = false;
+
+ // Eliminate double slashes and any leading / on the path.
+ string[] components
+ = m_invPath.Split(
+ new string[] { InventoryFolderImpl.PATH_DELIMITER }, StringSplitOptions.RemoveEmptyEntries);
+
+ int maxComponentIndex = components.Length - 1;
+
+ // If the path terminates with a STAR then later on we want to archive all nodes in the folder but not the
+ // folder itself. This may get more sophisicated later on
+ if (maxComponentIndex >= 0 && components[maxComponentIndex] == STAR_WILDCARD)
+ {
+ foundStar = true;
+ maxComponentIndex--;
+ }
+
+ m_invPath = String.Empty;
+ for (int i = 0; i <= maxComponentIndex; i++)
+ {
+ m_invPath += components[i] + InventoryFolderImpl.PATH_DELIMITER;
+ }
+
+ // Annoyingly Split actually returns the original string if the input string consists only of delimiters
+ // Therefore if we still start with a / after the split, then we need the root folder
+ if (m_invPath.Length == 0)
+ {
+ inventoryFolder = rootFolder;
+ }
+ else
+ {
+ m_invPath = m_invPath.Remove(m_invPath.LastIndexOf(InventoryFolderImpl.PATH_DELIMITER));
+ List candidateFolders
+ = InventoryArchiveUtils.FindFolderByPath(m_scene.InventoryService, rootFolder, m_invPath);
+ if (candidateFolders.Count > 0)
+ inventoryFolder = candidateFolders[0];
+ }
+
+ // The path may point to an item instead
+ if (inventoryFolder == null)
+ {
+ inventoryItem = InventoryArchiveUtils.FindItemByPath(m_scene.InventoryService, rootFolder, m_invPath);
+ //inventoryItem = m_userInfo.RootFolder.FindItemByPath(m_invPath);
+ }
+
+ if (null == inventoryFolder && null == inventoryItem)
+ {
+ // We couldn't find the path indicated
+ string errorMessage = string.Format("Aborted save. Could not find inventory path {0}", m_invPath);
+ Exception e = new InventoryArchiverException(errorMessage);
+ m_module.TriggerInventoryArchiveSaved(m_id, false, m_userInfo, m_invPath, m_saveStream, e);
+ throw e;
+ }
+
+ m_archiveWriter = new TarArchiveWriter(m_saveStream);
+
if (inventoryFolder != null)
{
m_log.DebugFormat(
@@ -297,16 +297,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
// Don't put all this profile information into the archive right now.
//SaveUsers();
+
+ new AssetsRequest(
+ new AssetsArchiver(m_archiveWriter), m_assetUuids, m_scene.AssetService, ReceivedAllAssets).Execute();
}
catch (Exception)
{
- m_archiveWriter.Close();
+ m_saveStream.Close();
throw;
}
-
- new AssetsRequest(
- new AssetsArchiver(m_archiveWriter), m_assetUuids,
- m_scene.AssetService, ReceivedAllAssets).Execute();
}
///
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverException.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverException.cs
new file mode 100644
index 0000000000..e07e2ca689
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverException.cs
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSimulator Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+
+namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
+{
+ ///
+ /// Signals an inventory archiving problem
+ ///
+ public class InventoryArchiverException : Exception
+ {
+ public InventoryArchiverException(string message) : base(message) {}
+ public InventoryArchiverException(string message, Exception e) : base(message, e) {}
+ }
+}
\ No newline at end of file
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs
index cfefbe9d3b..f7a2b098f5 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs
@@ -322,34 +322,41 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
///
protected void HandleLoadInvConsoleCommand(string module, string[] cmdparams)
{
- m_log.Info("[INVENTORY ARCHIVER]: PLEASE NOTE THAT THIS FACILITY IS EXPERIMENTAL. BUG REPORTS WELCOME.");
-
- Dictionary options = new Dictionary();
- OptionSet optionSet = new OptionSet().Add("m|merge", delegate (string v) { options["merge"] = v != null; });
-
- List mainParams = optionSet.Parse(cmdparams);
-
- if (mainParams.Count < 6)
- {
- m_log.Error(
- "[INVENTORY ARCHIVER]: usage is load iar []");
- return;
- }
-
- string firstName = mainParams[2];
- string lastName = mainParams[3];
- string invPath = mainParams[4];
- string pass = mainParams[5];
- string loadPath = (mainParams.Count > 6 ? mainParams[6] : DEFAULT_INV_BACKUP_FILENAME);
-
- m_log.InfoFormat(
- "[INVENTORY ARCHIVER]: Loading archive {0} to inventory path {1} for {2} {3}",
- loadPath, invPath, firstName, lastName);
-
- if (DearchiveInventory(firstName, lastName, invPath, pass, loadPath, options))
+ try
+ {
+ m_log.Info("[INVENTORY ARCHIVER]: PLEASE NOTE THAT THIS FACILITY IS EXPERIMENTAL. BUG REPORTS WELCOME.");
+
+ Dictionary options = new Dictionary();
+ OptionSet optionSet = new OptionSet().Add("m|merge", delegate (string v) { options["merge"] = v != null; });
+
+ List mainParams = optionSet.Parse(cmdparams);
+
+ if (mainParams.Count < 6)
+ {
+ m_log.Error(
+ "[INVENTORY ARCHIVER]: usage is load iar []");
+ return;
+ }
+
+ string firstName = mainParams[2];
+ string lastName = mainParams[3];
+ string invPath = mainParams[4];
+ string pass = mainParams[5];
+ string loadPath = (mainParams.Count > 6 ? mainParams[6] : DEFAULT_INV_BACKUP_FILENAME);
+
m_log.InfoFormat(
- "[INVENTORY ARCHIVER]: Loaded archive {0} for {1} {2}",
- loadPath, firstName, lastName);
+ "[INVENTORY ARCHIVER]: Loading archive {0} to inventory path {1} for {2} {3}",
+ loadPath, invPath, firstName, lastName);
+
+ if (DearchiveInventory(firstName, lastName, invPath, pass, loadPath, options))
+ m_log.InfoFormat(
+ "[INVENTORY ARCHIVER]: Loaded archive {0} for {1} {2}",
+ loadPath, firstName, lastName);
+ }
+ catch (InventoryArchiverException e)
+ {
+ m_log.ErrorFormat("[INVENTORY ARCHIVER]: {0}", e.Message);
+ }
}
///
@@ -358,30 +365,38 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
///
protected void HandleSaveInvConsoleCommand(string module, string[] cmdparams)
{
- if (cmdparams.Length < 6)
- {
- m_log.Error(
- "[INVENTORY ARCHIVER]: usage is save iar []");
- return;
- }
-
- m_log.Info("[INVENTORY ARCHIVER]: PLEASE NOTE THAT THIS FACILITY IS EXPERIMENTAL. BUG REPORTS WELCOME.");
-
- string firstName = cmdparams[2];
- string lastName = cmdparams[3];
- string invPath = cmdparams[4];
- string pass = cmdparams[5];
- string savePath = (cmdparams.Length > 6 ? cmdparams[6] : DEFAULT_INV_BACKUP_FILENAME);
-
- m_log.InfoFormat(
- "[INVENTORY ARCHIVER]: Saving archive {0} using inventory path {1} for {2} {3}",
- savePath, invPath, firstName, lastName);
-
Guid id = Guid.NewGuid();
- ArchiveInventory(id, firstName, lastName, invPath, pass, savePath, new Dictionary());
-
+
+ try
+ {
+ if (cmdparams.Length < 6)
+ {
+ m_log.Error(
+ "[INVENTORY ARCHIVER]: usage is save iar []");
+ return;
+ }
+
+ m_log.Info("[INVENTORY ARCHIVER]: PLEASE NOTE THAT THIS FACILITY IS EXPERIMENTAL. BUG REPORTS WELCOME.");
+
+ string firstName = cmdparams[2];
+ string lastName = cmdparams[3];
+ string invPath = cmdparams[4];
+ string pass = cmdparams[5];
+ string savePath = (cmdparams.Length > 6 ? cmdparams[6] : DEFAULT_INV_BACKUP_FILENAME);
+
+ m_log.InfoFormat(
+ "[INVENTORY ARCHIVER]: Saving archive {0} using inventory path {1} for {2} {3}",
+ savePath, invPath, firstName, lastName);
+
+ ArchiveInventory(id, firstName, lastName, invPath, pass, savePath, new Dictionary());
+ }
+ catch (InventoryArchiverException e)
+ {
+ m_log.ErrorFormat("[INVENTORY ARCHIVER]: {0}", e.Message);
+ }
+
lock (m_pendingConsoleSaves)
- m_pendingConsoleSaves.Add(id);
+ m_pendingConsoleSaves.Add(id);
}
private void SaveInvConsoleCommandCompleted(
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 2a3727aa48..2ff6a5122a 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -158,7 +158,7 @@ namespace OpenSim.Region.Framework.Scenes
HasInventoryChanged = true;
m_part.ParentGroup.HasGroupChanged = true;
- IList items = new List(Items.Values);
+ List items = GetInventoryItems();
foreach (TaskInventoryItem item in items)
{
if (ownerId != item.OwnerID)
@@ -207,10 +207,7 @@ namespace OpenSim.Region.Framework.Scenes
foreach (TaskInventoryItem item in items)
{
if ((int)InventoryType.LSL == item.InvType)
- {
CreateScriptInstance(item, startParam, postOnRez, engine, stateSource);
- Thread.Sleep(10); // workaround for Mono cpu utilization > 100% bug
- }
}
}
@@ -256,8 +253,6 @@ namespace OpenSim.Region.Framework.Scenes
m_part.RemoveScriptEvents(item.ItemID);
}
}
-
-
}
///
@@ -270,7 +265,7 @@ namespace OpenSim.Region.Framework.Scenes
// m_log.InfoFormat(
// "[PRIM INVENTORY]: " +
// "Starting script {0}, {1} in prim {2}, {3}",
- // item.Name, item.ItemID, m_part.Name, m_part.UUID);
+ // item.Name, item.ItemID, Name, UUID);
if (!m_part.ParentGroup.Scene.Permissions.CanRunScript(item.ItemID, m_part.UUID, item.OwnerID))
{
@@ -558,7 +553,6 @@ namespace OpenSim.Region.Framework.Scenes
///
/// Check if the inventory holds an item with a given name.
- /// This method assumes that the task inventory is already locked.
///
///
///
@@ -663,7 +657,6 @@ namespace OpenSim.Region.Framework.Scenes
else
m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
-
m_inventorySerial++;
//m_inventorySerial += 2;
HasInventoryChanged = true;
@@ -754,7 +747,7 @@ namespace OpenSim.Region.Framework.Scenes
// changed since permissions were last set.
if (item.GroupPermissions != (uint)PermissionMask.None)
item.GroupID = m_part.GroupID;
-
+
if (item.AssetID == UUID.Zero)
{
item.AssetID = m_items[item.ItemID].AssetID;
@@ -1114,6 +1107,30 @@ namespace OpenSim.Region.Framework.Scenes
return ret;
}
+
+ public List GetInventoryItems()
+ {
+ List ret = new List();
+
+ lock (m_items)
+ ret = new List(m_items.Values);
+
+ return ret;
+ }
+
+ public List GetInventoryScripts()
+ {
+ List ret = new List();
+
+ lock (m_items)
+ {
+ foreach (TaskInventoryItem item in m_items.Values)
+ if (item.InvType == (int)InventoryType.LSL)
+ ret.Add(item);
+ }
+
+ return ret;
+ }
public Dictionary GetScriptStates()
{
@@ -1181,10 +1198,11 @@ namespace OpenSim.Region.Framework.Scenes
engine.ResumeScript(item.ItemID);
}
}
- }
+ }
}
Items.LockItemsForRead(false);
}
+
}
}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 138bcc995d..1d4c235710 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -6134,6 +6134,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
PSYS_PART_MAX_AGE = 7,
PSYS_SRC_ACCEL = 8,
PSYS_SRC_PATTERN = 9,
+ PSYS_SRC_INNERANGLE = 10,
+ PSYS_SRC_OUTERANGLE = 11,
PSYS_SRC_TEXTURE = 12,
PSYS_SRC_BURST_RATE = 13,
PSYS_SRC_BURST_PART_COUNT = 15,
@@ -6266,6 +6268,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
prules.Pattern = (Primitive.ParticleSystem.SourcePattern)tmpi;
break;
+ // PSYS_SRC_INNERANGLE and PSYS_SRC_ANGLE_BEGIN use the same variables. The
+ // PSYS_SRC_OUTERANGLE and PSYS_SRC_ANGLE_END also use the same variable. The
+ // client tells the difference between the two by looking at the 0x02 bit in
+ // the PartFlags variable.
+ case (int)ScriptBaseClass.PSYS_SRC_INNERANGLE:
+ tempf = (float)rules.GetLSLFloatItem(i + 1);
+ prules.InnerAngle = (float)tempf;
+ prules.PartFlags &= 0xFFFFFFFD; // Make sure new angle format is off.
+ break;
+
+ case (int)ScriptBaseClass.PSYS_SRC_OUTERANGLE:
+ tempf = (float)rules.GetLSLFloatItem(i + 1);
+ prules.OuterAngle = (float)tempf;
+ prules.PartFlags &= 0xFFFFFFFD; // Make sure new angle format is off.
+ break;
+
case (int)ScriptBaseClass.PSYS_SRC_TEXTURE:
prules.Texture = KeyOrName(rules.GetLSLStringItem(i + 1));
break;
@@ -6322,11 +6340,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
case (int)ScriptBaseClass.PSYS_SRC_ANGLE_BEGIN:
tempf = (float)rules.GetLSLFloatItem(i + 1);
prules.InnerAngle = (float)tempf;
+ prules.PartFlags |= 0x02; // Set new angle format.
break;
case (int)ScriptBaseClass.PSYS_SRC_ANGLE_END:
tempf = (float)rules.GetLSLFloatItem(i + 1);
prules.OuterAngle = (float)tempf;
+ prules.PartFlags |= 0x02; // Set new angle format.
break;
case (int)ScriptBaseClass.PSYS_SRC_INNERANGLE:
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index d4c17270d4..916e27f8fc 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -769,8 +769,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine
}
}
-
-
ScriptInstance instance = null;
// Create the object record
lockScriptsForRead(true);
@@ -952,7 +950,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine
CleanAssemblies();
-
ScriptRemoved handlerScriptRemoved = OnScriptRemoved;
if (handlerScriptRemoved != null)
handlerScriptRemoved(itemID);
@@ -1086,26 +1083,33 @@ namespace OpenSim.Region.ScriptEngine.XEngine
public bool PostObjectEvent(uint localID, EventParams p)
{
bool result = false;
-
+ List uuids = null;
+
lock (m_PrimObjects)
{
if (!m_PrimObjects.ContainsKey(localID))
return false;
-
- foreach (UUID itemID in m_PrimObjects[localID])
+ uuids = m_PrimObjects[localID];
+ }
+
+ foreach (UUID itemID in uuids)
+ {
+ IScriptInstance instance = null;
+ try
{
if (m_Scripts.ContainsKey(itemID))
- {
- IScriptInstance instance = m_Scripts[itemID];
- if (instance != null)
- {
- instance.PostEvent(p);
- result = true;
- }
- }
+ instance = m_Scripts[itemID];
+ }
+ catch { /* ignore race conditions */ }
+
+ if (instance != null)
+ {
+ instance.PostEvent(p);
+ result = true;
}
}
+
return result;
}
diff --git a/bin/Robust.HG.ini.example b/bin/Robust.HG.ini.example
index 6b0029f0f7..0cf9ab1431 100644
--- a/bin/Robust.HG.ini.example
+++ b/bin/Robust.HG.ini.example
@@ -11,7 +11,7 @@
;;
[Startup]
-ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003/OpenSim.Server.Handlers.dll:XInventoryInConnector,8002/OpenSim.Server.Handlers.dll:FreeswitchServerConnector,8003/OpenSim.Server.Handlers.dll:GridServiceConnector,8003/OpenSim.Server.Handlers.dll:GridInfoServerInConnector,8003/OpenSim.Server.Handlers.dll:AuthenticationServiceConnector,8002/OpenSim.Server.Handlers.dll:OpenIdServerConnector,8003/OpenSim.Server.Handlers.dll:AvatarServiceConnector,8002/OpenSim.Server.Handlers.dll:LLLoginServiceInConnector,8003/OpenSim.Server.Handlers.dll:PresenceServiceConnector,8003/OpenSim.Server.Handlers.dll:UserAccountServiceConnector,8003/OpenSim.Server.Handlers.dll:GridUserServiceConnector,8003/OpenSim.Server.Handlers.dll:FriendsServiceConnector,8002/OpenSim.Server.Handlers.dll:GatekeeperServiceInConnector,8002/OpenSim.Server.Handlers.dll:UserAgentServerConnector,HGInventoryService@8002/OpenSim.Server.Handlers.dll:XInventoryInConnector,8002/OpenSim.Server.Handlers.dll:AssetServiceConnector"
+ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003/OpenSim.Server.Handlers.dll:XInventoryInConnector,8002/OpenSim.Server.Handlers.dll:FreeswitchServerConnector,8003/OpenSim.Server.Handlers.dll:GridServiceConnector,8002/OpenSim.Server.Handlers.dll:GridInfoServerInConnector,8003/OpenSim.Server.Handlers.dll:AuthenticationServiceConnector,8002/OpenSim.Server.Handlers.dll:OpenIdServerConnector,8003/OpenSim.Server.Handlers.dll:AvatarServiceConnector,8002/OpenSim.Server.Handlers.dll:LLLoginServiceInConnector,8003/OpenSim.Server.Handlers.dll:PresenceServiceConnector,8003/OpenSim.Server.Handlers.dll:UserAccountServiceConnector,8003/OpenSim.Server.Handlers.dll:GridUserServiceConnector,8003/OpenSim.Server.Handlers.dll:FriendsServiceConnector,8002/OpenSim.Server.Handlers.dll:GatekeeperServiceInConnector,8002/OpenSim.Server.Handlers.dll:UserAgentServerConnector,HGInventoryService@8002/OpenSim.Server.Handlers.dll:XInventoryInConnector,8002/OpenSim.Server.Handlers.dll:AssetServiceConnector"
; * This is common for all services, it's the network setup for the entire
; * server instance, if none if specified above