Merge branch 'master' into careminster

Conflicts:
	OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
	OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
	OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
	OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
avinationmerge
Melanie 2012-07-12 08:55:16 +01:00
commit d632fd7124
32 changed files with 395 additions and 168 deletions

View File

@ -50,7 +50,7 @@ namespace OpenSim.ConsoleClient
request.ContentType = "application/x-www-form-urlencoded"; request.ContentType = "application/x-www-form-urlencoded";
byte[] buffer = new System.Text.ASCIIEncoding().GetBytes(data); byte[] buffer = Encoding.ASCII.GetBytes(data);
int length = (int) buffer.Length; int length = (int) buffer.Length;
request.ContentLength = length; request.ContentLength = length;

View File

@ -44,8 +44,6 @@ namespace OpenSim.Framework.Serialization.External
{ {
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
protected static UTF8Encoding m_utf8Encoding = new UTF8Encoding();
private static Dictionary<string, Action<LandData, XmlTextReader>> m_ldProcessors private static Dictionary<string, Action<LandData, XmlTextReader>> m_ldProcessors
= new Dictionary<string, Action<LandData, XmlTextReader>>(); = new Dictionary<string, Action<LandData, XmlTextReader>>();
@ -163,7 +161,7 @@ namespace OpenSim.Framework.Serialization.External
/// <exception cref="System.Xml.XmlException"></exception> /// <exception cref="System.Xml.XmlException"></exception>
public static LandData Deserialize(byte[] serializedLandData) public static LandData Deserialize(byte[] serializedLandData)
{ {
return Deserialize(m_utf8Encoding.GetString(serializedLandData, 0, serializedLandData.Length)); return Deserialize(Encoding.UTF8.GetString(serializedLandData, 0, serializedLandData.Length));
} }
/// <summary> /// <summary>

View File

@ -40,8 +40,6 @@ namespace OpenSim.Framework.Serialization.External
/// </summary> /// </summary>
public class RegionSettingsSerializer public class RegionSettingsSerializer
{ {
protected static ASCIIEncoding m_asciiEncoding = new ASCIIEncoding();
/// <summary> /// <summary>
/// Deserialize settings /// Deserialize settings
/// </summary> /// </summary>
@ -50,7 +48,7 @@ namespace OpenSim.Framework.Serialization.External
/// <exception cref="System.Xml.XmlException"></exception> /// <exception cref="System.Xml.XmlException"></exception>
public static RegionSettings Deserialize(byte[] serializedSettings) public static RegionSettings Deserialize(byte[] serializedSettings)
{ {
return Deserialize(m_asciiEncoding.GetString(serializedSettings, 0, serializedSettings.Length)); return Deserialize(Encoding.ASCII.GetString(serializedSettings, 0, serializedSettings.Length));
} }
/// <summary> /// <summary>

View File

@ -53,8 +53,6 @@ namespace OpenSim.Framework.Serialization
TYPE_CONTIGUOUS_FILE = 8, TYPE_CONTIGUOUS_FILE = 8,
} }
protected static ASCIIEncoding m_asciiEncoding = new ASCIIEncoding();
/// <summary> /// <summary>
/// Binary reader for the underlying stream /// Binary reader for the underlying stream
/// </summary> /// </summary>
@ -120,13 +118,13 @@ namespace OpenSim.Framework.Serialization
if (header[156] == (byte)'L') if (header[156] == (byte)'L')
{ {
int longNameLength = ConvertOctalBytesToDecimal(header, 124, 11); int longNameLength = ConvertOctalBytesToDecimal(header, 124, 11);
tarHeader.FilePath = m_asciiEncoding.GetString(ReadData(longNameLength)); tarHeader.FilePath = Encoding.ASCII.GetString(ReadData(longNameLength));
//m_log.DebugFormat("[TAR ARCHIVE READER]: Got long file name {0}", tarHeader.FilePath); //m_log.DebugFormat("[TAR ARCHIVE READER]: Got long file name {0}", tarHeader.FilePath);
header = m_br.ReadBytes(512); header = m_br.ReadBytes(512);
} }
else else
{ {
tarHeader.FilePath = m_asciiEncoding.GetString(header, 0, 100); tarHeader.FilePath = Encoding.ASCII.GetString(header, 0, 100);
tarHeader.FilePath = tarHeader.FilePath.Trim(m_nullCharArray); tarHeader.FilePath = tarHeader.FilePath.Trim(m_nullCharArray);
//m_log.DebugFormat("[TAR ARCHIVE READER]: Got short file name {0}", tarHeader.FilePath); //m_log.DebugFormat("[TAR ARCHIVE READER]: Got short file name {0}", tarHeader.FilePath);
} }
@ -205,7 +203,7 @@ namespace OpenSim.Framework.Serialization
{ {
// Trim leading white space: ancient tars do that instead // Trim leading white space: ancient tars do that instead
// of leading 0s :-( don't ask. really. // of leading 0s :-( don't ask. really.
string oString = m_asciiEncoding.GetString(bytes, startIndex, count).TrimStart(m_spaceCharArray); string oString = Encoding.ASCII.GetString(bytes, startIndex, count).TrimStart(m_spaceCharArray);
int d = 0; int d = 0;

View File

@ -41,7 +41,6 @@ namespace OpenSim.Framework.Serialization
{ {
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
protected static ASCIIEncoding m_asciiEncoding = new ASCIIEncoding();
protected static UTF8Encoding m_utf8Encoding = new UTF8Encoding(); protected static UTF8Encoding m_utf8Encoding = new UTF8Encoding();
/// <summary> /// <summary>
@ -85,7 +84,7 @@ namespace OpenSim.Framework.Serialization
public void WriteFile(string filePath, byte[] data) public void WriteFile(string filePath, byte[] data)
{ {
if (filePath.Length > 100) if (filePath.Length > 100)
WriteEntry("././@LongLink", m_asciiEncoding.GetBytes(filePath), 'L'); WriteEntry("././@LongLink", Encoding.ASCII.GetBytes(filePath), 'L');
char fileType; char fileType;
@ -137,7 +136,7 @@ namespace OpenSim.Framework.Serialization
oString = "0" + oString; oString = "0" + oString;
} }
byte[] oBytes = m_asciiEncoding.GetBytes(oString); byte[] oBytes = Encoding.ASCII.GetBytes(oString);
return oBytes; return oBytes;
} }
@ -156,20 +155,20 @@ namespace OpenSim.Framework.Serialization
byte[] header = new byte[512]; byte[] header = new byte[512];
// file path field (100) // file path field (100)
byte[] nameBytes = m_asciiEncoding.GetBytes(filePath); byte[] nameBytes = Encoding.ASCII.GetBytes(filePath);
int nameSize = (nameBytes.Length >= 100) ? 100 : nameBytes.Length; int nameSize = (nameBytes.Length >= 100) ? 100 : nameBytes.Length;
Array.Copy(nameBytes, header, nameSize); Array.Copy(nameBytes, header, nameSize);
// file mode (8) // file mode (8)
byte[] modeBytes = m_asciiEncoding.GetBytes("0000777"); byte[] modeBytes = Encoding.ASCII.GetBytes("0000777");
Array.Copy(modeBytes, 0, header, 100, 7); Array.Copy(modeBytes, 0, header, 100, 7);
// owner user id (8) // owner user id (8)
byte[] ownerIdBytes = m_asciiEncoding.GetBytes("0000764"); byte[] ownerIdBytes = Encoding.ASCII.GetBytes("0000764");
Array.Copy(ownerIdBytes, 0, header, 108, 7); Array.Copy(ownerIdBytes, 0, header, 108, 7);
// group user id (8) // group user id (8)
byte[] groupIdBytes = m_asciiEncoding.GetBytes("0000764"); byte[] groupIdBytes = Encoding.ASCII.GetBytes("0000764");
Array.Copy(groupIdBytes, 0, header, 116, 7); Array.Copy(groupIdBytes, 0, header, 116, 7);
// file size in bytes (12) // file size in bytes (12)
@ -181,17 +180,17 @@ namespace OpenSim.Framework.Serialization
Array.Copy(fileSizeBytes, 0, header, 124, 11); Array.Copy(fileSizeBytes, 0, header, 124, 11);
// last modification time (12) // last modification time (12)
byte[] lastModTimeBytes = m_asciiEncoding.GetBytes("11017037332"); byte[] lastModTimeBytes = Encoding.ASCII.GetBytes("11017037332");
Array.Copy(lastModTimeBytes, 0, header, 136, 11); Array.Copy(lastModTimeBytes, 0, header, 136, 11);
// entry type indicator (1) // entry type indicator (1)
header[156] = m_asciiEncoding.GetBytes(new char[] { fileType })[0]; header[156] = Encoding.ASCII.GetBytes(new char[] { fileType })[0];
Array.Copy(m_asciiEncoding.GetBytes("0000000"), 0, header, 329, 7); Array.Copy(Encoding.ASCII.GetBytes("0000000"), 0, header, 329, 7);
Array.Copy(m_asciiEncoding.GetBytes("0000000"), 0, header, 337, 7); Array.Copy(Encoding.ASCII.GetBytes("0000000"), 0, header, 337, 7);
// check sum for header block (8) [calculated last] // check sum for header block (8) [calculated last]
Array.Copy(m_asciiEncoding.GetBytes(" "), 0, header, 148, 8); Array.Copy(Encoding.ASCII.GetBytes(" "), 0, header, 148, 8);
int checksum = 0; int checksum = 0;
foreach (byte b in header) foreach (byte b in header)

View File

@ -591,8 +591,8 @@ namespace OpenSim.Framework.Servers
{ {
string pidstring = System.Diagnostics.Process.GetCurrentProcess().Id.ToString(); string pidstring = System.Diagnostics.Process.GetCurrentProcess().Id.ToString();
FileStream fs = File.Create(path); FileStream fs = File.Create(path);
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
Byte[] buf = enc.GetBytes(pidstring); Byte[] buf = Encoding.ASCII.GetBytes(pidstring);
fs.Write(buf, 0, buf.Length); fs.Write(buf, 0, buf.Length);
fs.Close(); fs.Close();
m_pidFile = path; m_pidFile = path;

View File

@ -1248,8 +1248,7 @@ namespace OpenSim.Framework
public static string Base64ToString(string str) public static string Base64ToString(string str)
{ {
UTF8Encoding encoder = new UTF8Encoding(); Decoder utf8Decode = Encoding.UTF8.GetDecoder();
Decoder utf8Decode = encoder.GetDecoder();
byte[] todecode_byte = Convert.FromBase64String(str); byte[] todecode_byte = Convert.FromBase64String(str);
int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length); int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length);

View File

@ -237,7 +237,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
if (sp.PresenceType == PresenceType.Npc) if (sp.PresenceType == PresenceType.Npc)
RezSingleAttachmentFromInventoryInternal(sp, UUID.Zero, attach.AssetID, p, null); RezSingleAttachmentFromInventoryInternal(sp, UUID.Zero, attach.AssetID, p, null);
else else
RezSingleAttachmentFromInventory(sp, attach.ItemID, p, true, d); RezSingleAttachmentFromInventory(sp, attach.ItemID, p, d);
} }
catch (Exception e) catch (Exception e)
{ {
@ -405,10 +405,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
public ISceneEntity RezSingleAttachmentFromInventory(IScenePresence sp, UUID itemID, uint AttachmentPt) public ISceneEntity RezSingleAttachmentFromInventory(IScenePresence sp, UUID itemID, uint AttachmentPt)
{ {
return RezSingleAttachmentFromInventory(sp, itemID, AttachmentPt, true, null); return RezSingleAttachmentFromInventory(sp, itemID, AttachmentPt, null);
} }
public ISceneEntity RezSingleAttachmentFromInventory(IScenePresence sp, UUID itemID, uint AttachmentPt, bool updateInventoryStatus, XmlDocument doc) public ISceneEntity RezSingleAttachmentFromInventory(IScenePresence sp, UUID itemID, uint AttachmentPt, XmlDocument doc)
{ {
if (!Enabled) if (!Enabled)
return null; return null;
@ -596,6 +596,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
/// </remarks> /// </remarks>
/// <param name="sp"></param> /// <param name="sp"></param>
/// <param name="grp"></param> /// <param name="grp"></param>
/// <param name="saveAllScripted"></param>
private void UpdateKnownItem(IScenePresence sp, SceneObjectGroup grp, bool saveAllScripted) private void UpdateKnownItem(IScenePresence sp, SceneObjectGroup grp, bool saveAllScripted)
{ {
// Saving attachments for NPCs messes them up for the real owner! // Saving attachments for NPCs messes them up for the real owner!
@ -789,18 +790,23 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
null, assetID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, null, assetID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true,
false, false, sp.UUID, true); false, false, sp.UUID, true);
// m_log.DebugFormat(
// "[ATTACHMENTS MODULE]: Retrieved single object {0} for attachment to {1} on point {2}",
// objatt.Name, remoteClient.Name, AttachmentPt);
if (objatt != null) if (objatt != null)
{ {
// m_log.DebugFormat(
// "[ATTACHMENTS MODULE]: Rezzed single object {0} for attachment to {1} on point {2} in {3}",
// objatt.Name, sp.Name, attachmentPt, m_scene.Name);
// HasGroupChanged is being set from within RezObject. Ideally it would be set by the caller. // HasGroupChanged is being set from within RezObject. Ideally it would be set by the caller.
objatt.HasGroupChanged = false; objatt.HasGroupChanged = false;
bool tainted = false; bool tainted = false;
if (attachmentPt != 0 && attachmentPt != objatt.AttachmentPoint) if (attachmentPt != 0 && attachmentPt != objatt.AttachmentPoint)
tainted = true; tainted = true;
// FIXME: Detect whether it's really likely for AttachObject to throw an exception in the normal
// course of events. If not, then it's probably not worth trying to recover the situation
// since this is more likely to trigger further exceptions and confuse later debugging. If
// exceptions can be thrown in expected error conditions (not NREs) then make this consistent
// since other normal error conditions will simply return false instead.
// This will throw if the attachment fails // This will throw if the attachment fails
try try
{ {

View File

@ -31,6 +31,7 @@ using System.Reflection;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Timers; using System.Timers;
using System.Xml;
using Timer=System.Timers.Timer; using Timer=System.Timers.Timer;
using Nini.Config; using Nini.Config;
using NUnit.Framework; using NUnit.Framework;
@ -41,10 +42,12 @@ using OpenSim.Region.CoreModules.Avatar.Attachments;
using OpenSim.Region.CoreModules.Framework; using OpenSim.Region.CoreModules.Framework;
using OpenSim.Region.CoreModules.Framework.EntityTransfer; using OpenSim.Region.CoreModules.Framework.EntityTransfer;
using OpenSim.Region.CoreModules.Framework.InventoryAccess; using OpenSim.Region.CoreModules.Framework.InventoryAccess;
using OpenSim.Region.CoreModules.World.Serialiser; using OpenSim.Region.CoreModules.Scripting.WorldComm;
using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation; using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation;
using OpenSim.Region.CoreModules.World.Serialiser;
using OpenSim.Region.Framework.Scenes; using OpenSim.Region.Framework.Scenes;
using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.ScriptEngine.XEngine;
using OpenSim.Services.Interfaces; using OpenSim.Services.Interfaces;
using OpenSim.Tests.Common; using OpenSim.Tests.Common;
using OpenSim.Tests.Common.Mock; using OpenSim.Tests.Common.Mock;
@ -57,6 +60,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
[TestFixture] [TestFixture]
public class AttachmentsModuleTests : OpenSimTestCase public class AttachmentsModuleTests : OpenSimTestCase
{ {
private AutoResetEvent m_chatEvent = new AutoResetEvent(false);
private OSChatMessage m_osChatMessageReceived;
[TestFixtureSetUp] [TestFixtureSetUp]
public void FixtureInit() public void FixtureInit()
{ {
@ -72,16 +78,74 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod; Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod;
} }
private Scene CreateDefaultTestScene() private void OnChatFromWorld(object sender, OSChatMessage oscm)
{
// Console.WriteLine("Got chat [{0}]", oscm.Message);
m_osChatMessageReceived = oscm;
m_chatEvent.Set();
}
private Scene CreateTestScene()
{ {
IConfigSource config = new IniConfigSource(); IConfigSource config = new IniConfigSource();
List<object> modules = new List<object>();
AddCommonConfig(config, modules);
Scene scene
= new SceneHelpers().SetupScene(
"attachments-test-scene", TestHelpers.ParseTail(999), 1000, 1000, config);
SceneHelpers.SetupSceneModules(scene, config, modules.ToArray());
return scene;
}
private Scene CreateScriptingEnabledTestScene()
{
IConfigSource config = new IniConfigSource();
List<object> modules = new List<object>();
AddCommonConfig(config, modules);
AddScriptingConfig(config, modules);
Scene scene
= new SceneHelpers().SetupScene(
"attachments-test-scene", TestHelpers.ParseTail(999), 1000, 1000, config);
SceneHelpers.SetupSceneModules(scene, config, modules.ToArray());
scene.StartScripts();
return scene;
}
private void AddCommonConfig(IConfigSource config, List<object> modules)
{
config.AddConfig("Modules"); config.AddConfig("Modules");
config.Configs["Modules"].Set("InventoryAccessModule", "BasicInventoryAccessModule"); config.Configs["Modules"].Set("InventoryAccessModule", "BasicInventoryAccessModule");
Scene scene = new SceneHelpers().SetupScene(); modules.Add(new AttachmentsModule());
SceneHelpers.SetupSceneModules(scene, config, new AttachmentsModule(), new BasicInventoryAccessModule()); modules.Add(new BasicInventoryAccessModule());
}
return scene; private void AddScriptingConfig(IConfigSource config, List<object> modules)
{
IConfig startupConfig = config.AddConfig("Startup");
startupConfig.Set("DefaultScriptEngine", "XEngine");
IConfig xEngineConfig = config.AddConfig("XEngine");
xEngineConfig.Set("Enabled", "true");
xEngineConfig.Set("StartDelay", "0");
// These tests will not run with AppDomainLoading = true, at least on mono. For unknown reasons, the call
// to AssemblyResolver.OnAssemblyResolve fails.
xEngineConfig.Set("AppDomainLoading", "false");
modules.Add(new XEngine());
// Necessary to stop serialization complaining
// FIXME: Stop this being necessary if at all possible
// modules.Add(new WorldCommModule());
} }
/// <summary> /// <summary>
@ -116,7 +180,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
TestHelpers.InMethod(); TestHelpers.InMethod();
// TestHelpers.EnableLogging(); // TestHelpers.EnableLogging();
Scene scene = CreateDefaultTestScene(); Scene scene = CreateTestScene();
UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1);
ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1); ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1);
@ -163,7 +227,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
TestHelpers.InMethod(); TestHelpers.InMethod();
// TestHelpers.EnableLogging(); // TestHelpers.EnableLogging();
Scene scene = CreateDefaultTestScene(); Scene scene = CreateTestScene();
UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1);
ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1); ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1);
@ -185,12 +249,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
} }
[Test] [Test]
public void TestAddAttachmentFromInventory() public void TestRezAttachmentFromInventory()
{ {
TestHelpers.InMethod(); TestHelpers.InMethod();
// log4net.Config.XmlConfigurator.Configure(); // log4net.Config.XmlConfigurator.Configure();
Scene scene = CreateDefaultTestScene(); Scene scene = CreateTestScene();
UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1);
ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1.PrincipalID); ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1.PrincipalID);
@ -217,13 +281,38 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
Assert.That(scene.GetSceneObjectGroups().Count, Is.EqualTo(1)); Assert.That(scene.GetSceneObjectGroups().Count, Is.EqualTo(1));
} }
/// <summary>
/// Test specific conditions associated with rezzing a scripted attachment from inventory.
/// </summary>
[Test]
public void TestRezScriptedAttachmentFromInventory()
{
TestHelpers.InMethod();
Scene scene = CreateTestScene();
UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1);
ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1.PrincipalID);
SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, sp.UUID, "att-name", 0x10);
TaskInventoryHelpers.AddScript(scene, so.RootPart);
InventoryItemBase userItem = UserInventoryHelpers.AddInventoryItem(scene, so, 0x100, 0x1000);
scene.AttachmentsModule.RezSingleAttachmentFromInventory(sp, userItem.ID, (uint)AttachmentPoint.Chest);
// TODO: Need to have a test that checks the script is actually started but this involves a lot more
// plumbing of the script engine and either pausing for events or more infrastructure to turn off various
// script engine delays/asychronicity that isn't helpful in an automated regression testing context.
SceneObjectGroup attSo = scene.GetSceneObjectGroup(so.Name);
Assert.That(attSo.ContainsScripts(), Is.True);
}
[Test] [Test]
public void TestDetachAttachmentToGround() public void TestDetachAttachmentToGround()
{ {
TestHelpers.InMethod(); TestHelpers.InMethod();
// log4net.Config.XmlConfigurator.Configure(); // log4net.Config.XmlConfigurator.Configure();
Scene scene = CreateDefaultTestScene(); Scene scene = CreateTestScene();
UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1);
ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1.PrincipalID); ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1.PrincipalID);
@ -253,9 +342,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
public void TestDetachAttachmentToInventory() public void TestDetachAttachmentToInventory()
{ {
TestHelpers.InMethod(); TestHelpers.InMethod();
// log4net.Config.XmlConfigurator.Configure();
Scene scene = CreateDefaultTestScene(); Scene scene = CreateTestScene();
UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1);
ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1.PrincipalID); ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1.PrincipalID);
@ -277,6 +365,45 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
Assert.That(scene.GetSceneObjectGroups().Count, Is.EqualTo(0)); Assert.That(scene.GetSceneObjectGroups().Count, Is.EqualTo(0));
} }
/// <summary>
/// Test specific conditions associated with detaching a scripted attachment from inventory.
/// </summary>
[Test]
public void TestDetachScriptedAttachmentToInventory()
{
TestHelpers.InMethod();
// TestHelpers.EnableLogging();
Scene scene = CreateScriptingEnabledTestScene();
UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1);
ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1);
SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, sp.UUID, "att-name", 0x10);
TaskInventoryHelpers.AddScript(scene, so.RootPart);
InventoryItemBase userItem = UserInventoryHelpers.AddInventoryItem(scene, so, 0x100, 0x1000);
// FIXME: Right now, we have to do a tricksy chat listen to make sure we know when the script is running.
// In the future, we need to be able to do this programatically more predicably.
scene.EventManager.OnChatFromWorld += OnChatFromWorld;
SceneObjectGroup soRezzed
= (SceneObjectGroup)scene.AttachmentsModule.RezSingleAttachmentFromInventory(sp, userItem.ID, (uint)AttachmentPoint.Chest);
// Wait for chat to signal rezzed script has been started.
m_chatEvent.WaitOne(60000);
scene.AttachmentsModule.DetachSingleAttachmentToInv(sp, soRezzed);
InventoryItemBase userItemUpdated = scene.InventoryService.GetItem(userItem);
AssetBase asset = scene.AssetService.Get(userItemUpdated.AssetID.ToString());
XmlDocument soXml = new XmlDocument();
soXml.LoadXml(Encoding.UTF8.GetString(asset.Data));
XmlNodeList scriptStateNodes = soXml.GetElementsByTagName("ScriptState");
Assert.That(scriptStateNodes.Count, Is.EqualTo(1));
}
/// <summary> /// <summary>
/// Test that attachments don't hang about in the scene when the agent is closed /// Test that attachments don't hang about in the scene when the agent is closed
/// </summary> /// </summary>
@ -286,7 +413,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
TestHelpers.InMethod(); TestHelpers.InMethod();
// log4net.Config.XmlConfigurator.Configure(); // log4net.Config.XmlConfigurator.Configure();
Scene scene = CreateDefaultTestScene(); Scene scene = CreateTestScene();
UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1);
InventoryItemBase attItem = CreateAttachmentItem(scene, ua1.PrincipalID, "att", 0x10, 0x20); InventoryItemBase attItem = CreateAttachmentItem(scene, ua1.PrincipalID, "att", 0x10, 0x20);
@ -309,7 +436,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
TestHelpers.InMethod(); TestHelpers.InMethod();
// log4net.Config.XmlConfigurator.Configure(); // log4net.Config.XmlConfigurator.Configure();
Scene scene = CreateDefaultTestScene(); Scene scene = CreateTestScene();
UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1);
InventoryItemBase attItem = CreateAttachmentItem(scene, ua1.PrincipalID, "att", 0x10, 0x20); InventoryItemBase attItem = CreateAttachmentItem(scene, ua1.PrincipalID, "att", 0x10, 0x20);
@ -345,7 +472,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
{ {
TestHelpers.InMethod(); TestHelpers.InMethod();
Scene scene = CreateDefaultTestScene(); Scene scene = CreateTestScene();
UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1);
InventoryItemBase attItem = CreateAttachmentItem(scene, ua1.PrincipalID, "att", 0x10, 0x20); InventoryItemBase attItem = CreateAttachmentItem(scene, ua1.PrincipalID, "att", 0x10, 0x20);

View File

@ -46,8 +46,6 @@ namespace OpenSim.Region.CoreModules.World.Archiver
{ {
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
protected static ASCIIEncoding m_asciiEncoding = new ASCIIEncoding();
/// <summary> /// <summary>
/// Store for asset data we received before we get the metadata /// Store for asset data we received before we get the metadata
/// </summary> /// </summary>

View File

@ -252,7 +252,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
if (horizontalScale < 0.01d) if (horizontalScale < 0.01d)
horizontalScale = 0.01d; horizontalScale = 0.01d;
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); Encoding enc = Encoding.ASCII;
bs.Write(enc.GetBytes("TERRAGENTERRAIN ")); bs.Write(enc.GetBytes("TERRAGENTERRAIN "));

View File

@ -97,7 +97,7 @@ namespace OpenSim.Region.Framework.Interfaces
// Same as above, but also load script states from a separate doc // Same as above, but also load script states from a separate doc
ISceneEntity RezSingleAttachmentFromInventory( ISceneEntity RezSingleAttachmentFromInventory(
IScenePresence presence, UUID itemID, uint AttachmentPt, bool updateInventoryStatus, XmlDocument doc); IScenePresence presence, UUID itemID, uint AttachmentPt, XmlDocument doc);
/// <summary> /// <summary>
/// Rez multiple attachments from a user's inventory /// Rez multiple attachments from a user's inventory

View File

@ -646,6 +646,9 @@ namespace OpenSim.Region.Framework.Scenes
return; return;
} }
} }
// Restuff the new GroupPosition into each SOP of the linkset.
// This has the affect of resetting and tainting the physics actors.
SceneObjectPart[] parts = m_parts.GetArray(); SceneObjectPart[] parts = m_parts.GetArray();
bool triggerScriptEvent = m_rootPart.GroupPosition != val; bool triggerScriptEvent = m_rootPart.GroupPosition != val;
if (m_dupeInProgress) if (m_dupeInProgress)
@ -1755,6 +1758,9 @@ namespace OpenSim.Region.Framework.Scenes
public void ResetChildPrimPhysicsPositions() public void ResetChildPrimPhysicsPositions()
{ {
// Setting this SOG's absolute position also loops through and sets the positions
// of the SOP's in this SOG's linkset. This has the side affect of making sure
// the physics world matches the simulated world.
AbsolutePosition = AbsolutePosition; // could someone in the know please explain how this works? AbsolutePosition = AbsolutePosition; // could someone in the know please explain how this works?
// teravus: AbsolutePosition is NOT a normal property! // teravus: AbsolutePosition is NOT a normal property!
@ -2714,6 +2720,8 @@ namespace OpenSim.Region.Framework.Scenes
LinkToGroup(objectGroup, false); LinkToGroup(objectGroup, false);
} }
// Link an existing group to this group.
// The group being linked need not be a linkset -- it can have just one prim.
public void LinkToGroup(SceneObjectGroup objectGroup, bool insert) public void LinkToGroup(SceneObjectGroup objectGroup, bool insert)
{ {
// m_log.DebugFormat( // m_log.DebugFormat(
@ -2724,6 +2732,7 @@ namespace OpenSim.Region.Framework.Scenes
if (objectGroup == this) if (objectGroup == this)
return; return;
// 'linkPart' == the root of the group being linked into this group
SceneObjectPart linkPart = objectGroup.m_rootPart; SceneObjectPart linkPart = objectGroup.m_rootPart;
if (m_rootPart.PhysActor != null) if (m_rootPart.PhysActor != null)
@ -2735,31 +2744,44 @@ namespace OpenSim.Region.Framework.Scenes
bool grpusephys = UsesPhysics; bool grpusephys = UsesPhysics;
bool grptemporary = IsTemporary; bool grptemporary = IsTemporary;
// Remember where the group being linked thought it was
Vector3 oldGroupPosition = linkPart.GroupPosition; Vector3 oldGroupPosition = linkPart.GroupPosition;
Quaternion oldRootRotation = linkPart.RotationOffset; Quaternion oldRootRotation = linkPart.RotationOffset;
linkPart.OffsetPosition = linkPart.GroupPosition - AbsolutePosition; // A linked SOP remembers its location and rotation relative to the root of a group.
// Convert the root of the group being linked to be relative to the
// root of the group being linked to.
// Note: Some of the assignments have complex side effects.
// First move the new group's root SOP's position to be relative to ours
// (radams1: Not sure if the multiple setting of OffsetPosition is required. If not,
// this code can be reordered to have a more logical flow.)
linkPart.OffsetPosition = linkPart.GroupPosition - AbsolutePosition;
// Assign the new parent to the root of the old group
linkPart.ParentID = m_rootPart.LocalId; linkPart.ParentID = m_rootPart.LocalId;
// Now that it's a child, it's group position is our root position
linkPart.GroupPosition = AbsolutePosition; linkPart.GroupPosition = AbsolutePosition;
Vector3 axPos = linkPart.OffsetPosition; Vector3 axPos = linkPart.OffsetPosition;
// Rotate the linking root SOP's position to be relative to the new root prim
Quaternion parentRot = m_rootPart.RotationOffset; Quaternion parentRot = m_rootPart.RotationOffset;
axPos *= Quaternion.Conjugate(parentRot); axPos *= Quaternion.Conjugate(parentRot);
linkPart.OffsetPosition = axPos; linkPart.OffsetPosition = axPos;
// Make the linking root SOP's rotation relative to the new root prim
Quaternion oldRot = linkPart.RotationOffset; Quaternion oldRot = linkPart.RotationOffset;
Quaternion newRot = Quaternion.Conjugate(parentRot) * oldRot; Quaternion newRot = Quaternion.Conjugate(parentRot) * oldRot;
linkPart.RotationOffset = newRot; linkPart.RotationOffset = newRot;
// linkPart.ParentID = m_rootPart.LocalId; done above // If there is only one SOP in a SOG, the LinkNum is zero. I.e., not a linkset.
// Now that we know this SOG has at least two SOPs in it, the new root
// SOP becomes the first in the linkset.
if (m_rootPart.LinkNum == 0) if (m_rootPart.LinkNum == 0)
m_rootPart.LinkNum = 1; m_rootPart.LinkNum = 1;
lock (m_parts.SyncRoot) lock (m_parts.SyncRoot)
{ {
// Calculate the new link number for the old root SOP
int linkNum; int linkNum;
if (insert) if (insert)
{ {
@ -2775,6 +2797,7 @@ namespace OpenSim.Region.Framework.Scenes
linkNum = PrimCount + 1; linkNum = PrimCount + 1;
} }
// Add the old root SOP as a part in our group's list
m_parts.Add(linkPart.UUID, linkPart); m_parts.Add(linkPart.UUID, linkPart);
linkPart.SetParent(this); linkPart.SetParent(this);
@ -2782,6 +2805,8 @@ namespace OpenSim.Region.Framework.Scenes
// let physics know preserve part volume dtc messy since UpdatePrimFlags doesn't look to parent changes for now // let physics know preserve part volume dtc messy since UpdatePrimFlags doesn't look to parent changes for now
linkPart.UpdatePrimFlags(grpusephys, grptemporary, (IsPhantom || (linkPart.Flags & PrimFlags.Phantom) != 0), linkPart.VolumeDetectActive, true); linkPart.UpdatePrimFlags(grpusephys, grptemporary, (IsPhantom || (linkPart.Flags & PrimFlags.Phantom) != 0), linkPart.VolumeDetectActive, true);
// If the added SOP is physical, also tell the physics engine about the link relationship.
if (linkPart.PhysActor != null && m_rootPart.PhysActor != null && m_rootPart.PhysActor.IsPhysical) if (linkPart.PhysActor != null && m_rootPart.PhysActor != null && m_rootPart.PhysActor.IsPhysical)
{ {
linkPart.PhysActor.link(m_rootPart.PhysActor); linkPart.PhysActor.link(m_rootPart.PhysActor);
@ -2791,20 +2816,26 @@ namespace OpenSim.Region.Framework.Scenes
linkPart.LinkNum = linkNum++; linkPart.LinkNum = linkNum++;
linkPart.UpdatePrimFlags(UsesPhysics, IsTemporary, IsPhantom, IsVolumeDetect, false); linkPart.UpdatePrimFlags(UsesPhysics, IsTemporary, IsPhantom, IsVolumeDetect, false);
// Get a list of the SOP's in the old group in order of their linknum's.
SceneObjectPart[] ogParts = objectGroup.Parts; SceneObjectPart[] ogParts = objectGroup.Parts;
Array.Sort(ogParts, delegate(SceneObjectPart a, SceneObjectPart b) Array.Sort(ogParts, delegate(SceneObjectPart a, SceneObjectPart b)
{ {
return a.LinkNum - b.LinkNum; return a.LinkNum - b.LinkNum;
}); });
// Add each of the SOP's from the old linkset to our linkset
for (int i = 0; i < ogParts.Length; i++) for (int i = 0; i < ogParts.Length; i++)
{ {
SceneObjectPart part = ogParts[i]; SceneObjectPart part = ogParts[i];
if (part.UUID != objectGroup.m_rootPart.UUID) if (part.UUID != objectGroup.m_rootPart.UUID)
{ {
LinkNonRootPart(part, oldGroupPosition, oldRootRotation, linkNum++); LinkNonRootPart(part, oldGroupPosition, oldRootRotation, linkNum++);
// let physics know
// Update the physics flags for the newly added SOP
// (Is this necessary? LinkNonRootPart() has already called UpdatePrimFlags but with different flags!??)
part.UpdatePrimFlags(grpusephys, grptemporary, (IsPhantom || (part.Flags & PrimFlags.Phantom) != 0), part.VolumeDetectActive, true); part.UpdatePrimFlags(grpusephys, grptemporary, (IsPhantom || (part.Flags & PrimFlags.Phantom) != 0), part.VolumeDetectActive, true);
// If the added SOP is physical, also tell the physics engine about the link relationship.
if (part.PhysActor != null && m_rootPart.PhysActor != null && m_rootPart.PhysActor.IsPhysical) if (part.PhysActor != null && m_rootPart.PhysActor != null && m_rootPart.PhysActor.IsPhysical)
{ {
part.PhysActor.link(m_rootPart.PhysActor); part.PhysActor.link(m_rootPart.PhysActor);
@ -2815,6 +2846,7 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
// Now that we've aquired all of the old SOG's parts, remove the old SOG from the scene.
m_scene.UnlinkSceneObject(objectGroup, true); m_scene.UnlinkSceneObject(objectGroup, true);
objectGroup.IsDeleted = true; objectGroup.IsDeleted = true;
@ -2890,7 +2922,7 @@ namespace OpenSim.Region.Framework.Scenes
/// <remarks> /// <remarks>
/// FIXME: This method should not be called directly since it bypasses update locking, allowing a potential race /// FIXME: This method should not be called directly since it bypasses update locking, allowing a potential race
/// condition. But currently there is no /// condition. But currently there is no
/// alternative method that does take a lonk to delink a single prim. /// alternative method that does take a lock to delink a single prim.
/// </remarks> /// </remarks>
/// <param name="partID"></param> /// <param name="partID"></param>
/// <param name="sendEvents"></param> /// <param name="sendEvents"></param>
@ -2906,6 +2938,7 @@ namespace OpenSim.Region.Framework.Scenes
linkPart.ClearUndoState(); linkPart.ClearUndoState();
Vector3 worldPos = linkPart.GetWorldPosition();
Quaternion worldRot = linkPart.GetWorldRotation(); Quaternion worldRot = linkPart.GetWorldRotation();
// Remove the part from this object // Remove the part from this object
@ -2915,6 +2948,7 @@ namespace OpenSim.Region.Framework.Scenes
SceneObjectPart[] parts = m_parts.GetArray(); SceneObjectPart[] parts = m_parts.GetArray();
// Rejigger the linknum's of the remaining SOP's to fill any gap
if (parts.Length == 1 && RootPart != null) if (parts.Length == 1 && RootPart != null)
{ {
// Single prim left // Single prim left
@ -2936,22 +2970,31 @@ namespace OpenSim.Region.Framework.Scenes
PhysicsActor linkPartPa = linkPart.PhysActor; PhysicsActor linkPartPa = linkPart.PhysActor;
// Remove the SOP from the physical scene.
// If the new SOG is physical, it is re-created later.
// (There is a problem here in that we have not yet told the physics
// engine about the delink. Someday, linksets should be made first
// class objects in the physics engine interface).
if (linkPartPa != null) if (linkPartPa != null)
m_scene.PhysicsScene.RemovePrim(linkPartPa); m_scene.PhysicsScene.RemovePrim(linkPartPa);
// We need to reset the child part's position // We need to reset the child part's position
// ready for life as a separate object after being a part of another object // ready for life as a separate object after being a part of another object
/* This commented out code seems to recompute what GetWorldPosition already does.
* Replace with a call to GetWorldPosition (before unlinking)
Quaternion parentRot = m_rootPart.RotationOffset; Quaternion parentRot = m_rootPart.RotationOffset;
Vector3 axPos = linkPart.OffsetPosition; Vector3 axPos = linkPart.OffsetPosition;
axPos *= parentRot; axPos *= parentRot;
linkPart.OffsetPosition = new Vector3(axPos.X, axPos.Y, axPos.Z); linkPart.OffsetPosition = new Vector3(axPos.X, axPos.Y, axPos.Z);
linkPart.GroupPosition = AbsolutePosition + linkPart.OffsetPosition; linkPart.GroupPosition = AbsolutePosition + linkPart.OffsetPosition;
linkPart.OffsetPosition = new Vector3(0, 0, 0); linkPart.OffsetPosition = new Vector3(0, 0, 0);
*/
linkPart.GroupPosition = worldPos;
linkPart.OffsetPosition = Vector3.Zero;
linkPart.RotationOffset = worldRot; linkPart.RotationOffset = worldRot;
// Create a new SOG to go around this unlinked and unattached SOP
SceneObjectGroup objectGroup = new SceneObjectGroup(linkPart); SceneObjectGroup objectGroup = new SceneObjectGroup(linkPart);
m_scene.AddNewSceneObject(objectGroup, true); m_scene.AddNewSceneObject(objectGroup, true);
@ -2989,43 +3032,57 @@ namespace OpenSim.Region.Framework.Scenes
m_isBackedUp = false; m_isBackedUp = false;
} }
// This links an SOP from a previous linkset into my linkset.
// The trick is that the SOP's position and rotation are relative to the old root SOP's
// so we are passed in the position and rotation of the old linkset so this can
// unjigger this SOP's position and rotation from the previous linkset and
// then make them relative to my linkset root.
private void LinkNonRootPart(SceneObjectPart part, Vector3 oldGroupPosition, Quaternion oldGroupRotation, int linkNum) private void LinkNonRootPart(SceneObjectPart part, Vector3 oldGroupPosition, Quaternion oldGroupRotation, int linkNum)
{ {
Quaternion parentRot = oldGroupRotation; Quaternion parentRot = oldGroupRotation;
Quaternion oldRot = part.RotationOffset; Quaternion oldRot = part.RotationOffset;
Quaternion worldRot = parentRot * oldRot;
parentRot = oldGroupRotation;
// Move our position to not be relative to the old parent
Vector3 axPos = part.OffsetPosition; Vector3 axPos = part.OffsetPosition;
axPos *= parentRot; axPos *= parentRot;
part.OffsetPosition = axPos; part.OffsetPosition = axPos;
Vector3 newPos = oldGroupPosition + part.OffsetPosition; Vector3 newPos = oldGroupPosition + part.OffsetPosition;
part.GroupPosition = newPos; part.GroupPosition = newPos;
part.OffsetPosition = Vector3.Zero; part.OffsetPosition = Vector3.Zero;
// Compution our rotation to be not relative to the old parent
Quaternion worldRot = parentRot * oldRot;
part.RotationOffset = worldRot; part.RotationOffset = worldRot;
// Add this SOP to our linkset
part.SetParent(this); part.SetParent(this);
part.ParentID = m_rootPart.LocalId; part.ParentID = m_rootPart.LocalId;
m_parts.Add(part.UUID, part); m_parts.Add(part.UUID, part);
part.LinkNum = linkNum; part.LinkNum = linkNum;
part.OffsetPosition = newPos - AbsolutePosition; // Compute the new position of this SOP relative to the group position
part.OffsetPosition = part.GroupPosition - AbsolutePosition;
// (radams1 20120711: I don't know why part.OffsetPosition is set multiple times.
// It would have the affect of setting the physics engine position multiple
// times. In theory, that is not necessary but I don't have a good linkset
// test to know that cleaning up this code wouldn't break things.)
// Rotate the relative position by the rotation of the group
Quaternion rootRotation = m_rootPart.RotationOffset; Quaternion rootRotation = m_rootPart.RotationOffset;
Vector3 pos = part.OffsetPosition; Vector3 pos = part.OffsetPosition;
pos *= Quaternion.Conjugate(rootRotation); pos *= Quaternion.Conjugate(rootRotation);
part.OffsetPosition = pos; part.OffsetPosition = pos;
// Compute the SOP's rotation relative to the rotation of the group.
parentRot = m_rootPart.RotationOffset; parentRot = m_rootPart.RotationOffset;
oldRot = part.RotationOffset; oldRot = part.RotationOffset;
Quaternion newRot = Quaternion.Conjugate(parentRot) * worldRot; Quaternion newRot = Quaternion.Conjugate(parentRot) * worldRot;
part.RotationOffset = newRot; part.RotationOffset = newRot;
// Since this SOP's state has changed, push those changes into the physics engine
// and the simulator.
part.UpdatePrimFlags(UsesPhysics, IsTemporary, IsPhantom, IsVolumeDetect, false); part.UpdatePrimFlags(UsesPhysics, IsTemporary, IsPhantom, IsVolumeDetect, false);
} }

View File

@ -752,6 +752,7 @@ namespace OpenSim.Region.Framework.Scenes
return m_groupPosition; return m_groupPosition;
} }
// If I'm an attachment, my position is reported as the position of who I'm attached to
if (ParentGroup.IsAttachment) if (ParentGroup.IsAttachment)
{ {
ScenePresence sp = ParentGroup.Scene.GetScenePresence(ParentGroup.AttachedAvatar); ScenePresence sp = ParentGroup.Scene.GetScenePresence(ParentGroup.AttachedAvatar);
@ -779,7 +780,7 @@ namespace OpenSim.Region.Framework.Scenes
} }
else else
{ {
// To move the child prim in respect to the group position and rotation we have to calculate // The physics engine always sees all objects (root or linked) in world coordinates.
actor.Position = GetWorldPosition(); actor.Position = GetWorldPosition();
actor.Orientation = GetWorldRotation(); actor.Orientation = GetWorldRotation();
} }
@ -858,6 +859,8 @@ namespace OpenSim.Region.Framework.Scenes
{ {
// We don't want the physics engine mucking up the rotations in a linkset // We don't want the physics engine mucking up the rotations in a linkset
PhysicsActor actor = PhysActor; PhysicsActor actor = PhysActor;
// If this is a root of a linkset, the real rotation is what the physics engine thinks.
// If not a root prim, the offset rotation is computed by SOG and is relative to the root.
if (ParentID == 0 && (Shape.PCode != 9 || Shape.State == 0) && actor != null) if (ParentID == 0 && (Shape.PCode != 9 || Shape.State == 0) && actor != null)
{ {
if (actor.Orientation.X != 0f || actor.Orientation.Y != 0f if (actor.Orientation.X != 0f || actor.Orientation.Y != 0f
@ -2529,14 +2532,20 @@ namespace OpenSim.Region.Framework.Scenes
/// <returns>A Linked Child Prim objects position in world</returns> /// <returns>A Linked Child Prim objects position in world</returns>
public Vector3 GetWorldPosition() public Vector3 GetWorldPosition()
{ {
Quaternion parentRot = ParentGroup.RootPart.RotationOffset; Vector3 ret;
Vector3 axPos = OffsetPosition; if (_parentID == 0)
axPos *= parentRot; // if a root SOP, my position is what it is
Vector3 translationOffsetPosition = axPos; ret = GroupPosition;
if(_parentID == 0)
return GroupPosition;
else else
return ParentGroup.AbsolutePosition + translationOffsetPosition; {
// If a child SOP, my position is relative to the root SOP so take
// my info and add the root's position and rotation to
// get my world position.
Quaternion parentRot = ParentGroup.RootPart.RotationOffset;
Vector3 translationOffsetPosition = OffsetPosition * parentRot;
ret = ParentGroup.AbsolutePosition + translationOffsetPosition;
}
return ret;
} }
/// <summary> /// <summary>
@ -2553,6 +2562,8 @@ namespace OpenSim.Region.Framework.Scenes
} }
else else
{ {
// A child SOP's rotation is relative to the root SOP's rotation.
// Combine them to get my absolute rotation.
Quaternion parentRot = ParentGroup.RootPart.RotationOffset; Quaternion parentRot = ParentGroup.RootPart.RotationOffset;
Quaternion oldRot = RotationOffset; Quaternion oldRot = RotationOffset;
newRot = parentRot * oldRot; newRot = parentRot * oldRot;

View File

@ -1453,6 +1453,10 @@ namespace OpenSim.Region.Framework.Scenes
{ {
if (e != null) if (e != null)
{ {
// m_log.DebugFormat(
// "[PRIM INVENTORY]: Getting script state from engine {0} for {1} in part {2} in group {3} in {4}",
// e.Name, item.Name, m_part.Name, m_part.ParentGroup.Name, m_part.ParentGroup.Scene.Name);
string n = e.GetXMLState(item.ItemID); string n = e.GetXMLState(item.ItemID);
if (n != String.Empty) if (n != String.Empty)
{ {

View File

@ -823,11 +823,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
m_log.DebugFormat("[FreeSwitchVoice]: Region:Parcel \"{0}\": parcel id {1}: using channel name {2}", m_log.DebugFormat("[FreeSwitchVoice]: Region:Parcel \"{0}\": parcel id {1}: using channel name {2}",
landName, land.LocalID, landUUID); landName, land.LocalID, landUUID);
} }
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
// slvoice handles the sip address differently if it begins with confctl, hiding it from the user in the friends list. however it also disables // slvoice handles the sip address differently if it begins with confctl, hiding it from the user in the friends list. however it also disables
// the personal speech indicators as well unless some siren14-3d codec magic happens. we dont have siren143d so we'll settle for the personal speech indicator. // the personal speech indicators as well unless some siren14-3d codec magic happens. we dont have siren143d so we'll settle for the personal speech indicator.
channelUri = String.Format("sip:conf-{0}@{1}", "x" + Convert.ToBase64String(encoding.GetBytes(landUUID)), m_freeSwitchRealm); channelUri = String.Format("sip:conf-{0}@{1}", "x" + Convert.ToBase64String(Encoding.ASCII.GetBytes(landUUID)), m_freeSwitchRealm);
lock (m_ParcelAddress) lock (m_ParcelAddress)
{ {

View File

@ -1120,7 +1120,6 @@ namespace Nwc.XmlRpc
/// <summary>Class supporting the request side of an XML-RPC transaction.</summary> /// <summary>Class supporting the request side of an XML-RPC transaction.</summary>
public class ConfigurableKeepAliveXmlRpcRequest : XmlRpcRequest public class ConfigurableKeepAliveXmlRpcRequest : XmlRpcRequest
{ {
private Encoding _encoding = new ASCIIEncoding();
private XmlRpcRequestSerializer _serializer = new XmlRpcRequestSerializer(); private XmlRpcRequestSerializer _serializer = new XmlRpcRequestSerializer();
private XmlRpcResponseDeserializer _deserializer = new XmlRpcResponseDeserializer(); private XmlRpcResponseDeserializer _deserializer = new XmlRpcResponseDeserializer();
private bool _disableKeepAlive = true; private bool _disableKeepAlive = true;
@ -1153,7 +1152,7 @@ namespace Nwc.XmlRpc
request.KeepAlive = !_disableKeepAlive; request.KeepAlive = !_disableKeepAlive;
Stream stream = request.GetRequestStream(); Stream stream = request.GetRequestStream();
XmlTextWriter xml = new XmlTextWriter(stream, _encoding); XmlTextWriter xml = new XmlTextWriter(stream, Encoding.ASCII);
_serializer.Serialize(xml, this); _serializer.Serialize(xml, this);
xml.Flush(); xml.Flush();
xml.Close(); xml.Close();

View File

@ -425,10 +425,9 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
try try
{ {
System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding(); string jsondata = SLUtil.ParseNotecardToString(Encoding.UTF8.GetString(a.Data));
string jsondata = SLUtil.ParseNotecardToString(enc.GetString(a.Data)); int result = m_store.SetValue(storeID, path, jsondata,true) ? 1 : 0;
int result = m_store.SetValue(storeID,path,jsondata,true) ? 1 : 0; m_comms.DispatchReply(scriptID,result, "", reqID.ToString());
m_comms.DispatchReply(scriptID,result,"",reqID.ToString());
return; return;
} }
catch (Exception e) catch (Exception e)

View File

@ -482,10 +482,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
// Convert to base64 // Convert to base64
// //
string filetext = Convert.ToBase64String(data); string filetext = Convert.ToBase64String(data);
Byte[] buf = Encoding.ASCII.GetBytes(filetext);
ASCIIEncoding enc = new ASCIIEncoding();
Byte[] buf = enc.GetBytes(filetext);
m_log.Info("MRM 9"); m_log.Info("MRM 9");

View File

@ -233,17 +233,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_Timer[engine].UnSetTimerEvents(localID, itemID); m_Timer[engine].UnSetTimerEvents(localID, itemID);
// Remove from: HttpRequest // Remove from: HttpRequest
IHttpRequestModule iHttpReq = IHttpRequestModule iHttpReq = engine.World.RequestModuleInterface<IHttpRequestModule>();
engine.World.RequestModuleInterface<IHttpRequestModule>(); if (iHttpReq != null)
iHttpReq.StopHttpRequest(localID, itemID); iHttpReq.StopHttpRequest(localID, itemID);
IWorldComm comms = engine.World.RequestModuleInterface<IWorldComm>(); IWorldComm comms = engine.World.RequestModuleInterface<IWorldComm>();
if (comms != null) if (comms != null)
comms.DeleteListener(itemID); comms.DeleteListener(itemID);
IXMLRPC xmlrpc = engine.World.RequestModuleInterface<IXMLRPC>(); IXMLRPC xmlrpc = engine.World.RequestModuleInterface<IXMLRPC>();
xmlrpc.DeleteChannels(itemID); if (xmlrpc != null)
xmlrpc.CancelSRDRequests(itemID); {
xmlrpc.DeleteChannels(itemID);
xmlrpc.CancelSRDRequests(itemID);
}
// Remove Sensors // Remove Sensors
m_SensorRepeat[engine].UnSetSenseRepeaterEvents(localID, itemID); m_SensorRepeat[engine].UnSetSenseRepeaterEvents(localID, itemID);
@ -325,7 +328,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{ {
List<Object> data = new List<Object>(); List<Object> data = new List<Object>();
Object[] listeners=m_Listener[engine].GetSerializationData(itemID); Object[] listeners = m_Listener[engine].GetSerializationData(itemID);
if (listeners.Length > 0) if (listeners.Length > 0)
{ {
data.Add("listener"); data.Add("listener");

View File

@ -11918,9 +11918,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return; return;
} }
System.Text.UTF8Encoding enc = string data = Encoding.UTF8.GetString(a.Data);
new System.Text.UTF8Encoding();
string data = enc.GetString(a.Data);
//m_log.Debug(data); //m_log.Debug(data);
NotecardCache.Cache(id, data); NotecardCache.Cache(id, data);
AsyncCommands. AsyncCommands.
@ -11973,9 +11971,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return; return;
} }
System.Text.UTF8Encoding enc = string data = Encoding.UTF8.GetString(a.Data);
new System.Text.UTF8Encoding();
string data = enc.GetString(a.Data);
//m_log.Debug(data); //m_log.Debug(data);
NotecardCache.Cache(id, data); NotecardCache.Cache(id, data);
AsyncCommands.DataserverPlugin.DataserverReply(id.ToString(), AsyncCommands.DataserverPlugin.DataserverReply(id.ToString(),

View File

@ -1822,8 +1822,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (a == null) if (a == null)
return UUID.Zero; return UUID.Zero;
System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding(); string data = Encoding.UTF8.GetString(a.Data);
string data = enc.GetString(a.Data);
NotecardCache.Cache(assetID, data); NotecardCache.Cache(assetID, data);
}; };

View File

@ -88,13 +88,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
public Object[] GetSerializationData(UUID itemID) public Object[] GetSerializationData(UUID itemID)
{ {
return m_commsPlugin.GetSerializationData(itemID); if (m_commsPlugin != null)
return m_commsPlugin.GetSerializationData(itemID);
else
return new Object[]{};
} }
public void CreateFromData(uint localID, UUID itemID, UUID hostID, public void CreateFromData(uint localID, UUID itemID, UUID hostID,
Object[] data) Object[] data)
{ {
m_commsPlugin.CreateFromData(localID, itemID, hostID, data); if (m_commsPlugin != null)
m_commsPlugin.CreateFromData(localID, itemID, hostID, data);
} }
} }
} }

View File

@ -31,6 +31,7 @@ using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.Reflection; using System.Reflection;
using System.IO; using System.IO;
using System.Text;
using Microsoft.CSharp; using Microsoft.CSharp;
//using Microsoft.JScript; //using Microsoft.JScript;
using Microsoft.VisualBasic; using Microsoft.VisualBasic;
@ -711,9 +712,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
// //
string filetext = System.Convert.ToBase64String(data); string filetext = System.Convert.ToBase64String(data);
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); Byte[] buf = Encoding.ASCII.GetBytes(filetext);
Byte[] buf = enc.GetBytes(filetext);
FileStream sfs = File.Create(assembly + ".text"); FileStream sfs = File.Create(assembly + ".text");
sfs.Write(buf, 0, buf.Length); sfs.Write(buf, 0, buf.Length);
@ -804,8 +803,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
mapstring += String.Format("{0},{1},{2},{3}\n", k.Key, k.Value, v.Key, v.Value); mapstring += String.Format("{0},{1},{2},{3}\n", k.Key, k.Value, v.Key, v.Value);
} }
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); Byte[] mapbytes = Encoding.ASCII.GetBytes(mapstring);
Byte[] mapbytes = enc.GetBytes(mapstring);
FileStream mfs = File.Create(filename); FileStream mfs = File.Create(filename);
mfs.Write(mapbytes, 0, mapbytes.Length); mfs.Write(mapbytes, 0, mapbytes.Length);
mfs.Close(); mfs.Close();

View File

@ -26,16 +26,17 @@
*/ */
using System; using System;
using System.IO;
using System.Diagnostics; //for [DebuggerNonUserCode]
using System.Runtime.Remoting;
using System.Runtime.Remoting.Lifetime;
using System.Threading;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Security.Policy;
using System.Reflection;
using System.Globalization; using System.Globalization;
using System.IO;
using System.Diagnostics; //for [DebuggerNonUserCode]
using System.Reflection;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Lifetime;
using System.Security.Policy;
using System.Text;
using System.Threading;
using System.Xml; using System.Xml;
using OpenMetaverse; using OpenMetaverse;
using log4net; using log4net;
@ -298,13 +299,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
using (FileStream fs = File.Open(savedState, using (FileStream fs = File.Open(savedState,
FileMode.Open, FileAccess.Read, FileShare.None)) FileMode.Open, FileAccess.Read, FileShare.None))
{ {
System.Text.UTF8Encoding enc =
new System.Text.UTF8Encoding();
Byte[] data = new Byte[size]; Byte[] data = new Byte[size];
fs.Read(data, 0, size); fs.Read(data, 0, size);
xml = enc.GetString(data); xml = Encoding.UTF8.GetString(data);
ScriptSerializer.Deserialize(xml, this); ScriptSerializer.Deserialize(xml, this);
@ -956,8 +954,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
try try
{ {
FileStream fs = File.Create(Path.Combine(Path.GetDirectoryName(assembly), ItemID.ToString() + ".state")); FileStream fs = File.Create(Path.Combine(Path.GetDirectoryName(assembly), ItemID.ToString() + ".state"));
System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding(); Byte[] buf = (new UTF8Encoding()).GetBytes(xml);
Byte[] buf = enc.GetBytes(xml);
fs.Write(buf, 0, buf.Length); fs.Write(buf, 0, buf.Length);
fs.Close(); fs.Close();
} }

View File

@ -58,9 +58,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine.Tests
// Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory); // Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory);
m_xEngine = new XEngine(); m_xEngine = new XEngine();
// Necessary to stop serialization complaining
WorldCommModule wcModule = new WorldCommModule();
IniConfigSource configSource = new IniConfigSource(); IniConfigSource configSource = new IniConfigSource();
IConfig startupConfig = configSource.AddConfig("Startup"); IConfig startupConfig = configSource.AddConfig("Startup");
@ -68,13 +65,14 @@ namespace OpenSim.Region.ScriptEngine.XEngine.Tests
IConfig xEngineConfig = configSource.AddConfig("XEngine"); IConfig xEngineConfig = configSource.AddConfig("XEngine");
xEngineConfig.Set("Enabled", "true"); xEngineConfig.Set("Enabled", "true");
xEngineConfig.Set("StartDelay", "0");
// These tests will not run with AppDomainLoading = true, at least on mono. For unknown reasons, the call // These tests will not run with AppDomainLoading = true, at least on mono. For unknown reasons, the call
// to AssemblyResolver.OnAssemblyResolve fails. // to AssemblyResolver.OnAssemblyResolve fails.
xEngineConfig.Set("AppDomainLoading", "false"); xEngineConfig.Set("AppDomainLoading", "false");
m_scene = new SceneHelpers().SetupScene("My Test", UUID.Random(), 1000, 1000, configSource); m_scene = new SceneHelpers().SetupScene("My Test", UUID.Random(), 1000, 1000, configSource);
SceneHelpers.SetupSceneModules(m_scene, configSource, m_xEngine, wcModule); SceneHelpers.SetupSceneModules(m_scene, configSource, m_xEngine);
m_scene.StartScripts(); m_scene.StartScripts();
} }

View File

@ -78,7 +78,13 @@ namespace OpenSim.Region.ScriptEngine.XEngine
private IConfigSource m_ConfigSource = null; private IConfigSource m_ConfigSource = null;
private ICompiler m_Compiler; private ICompiler m_Compiler;
private int m_MinThreads; private int m_MinThreads;
private int m_MaxThreads ; private int m_MaxThreads;
/// <summary>
/// Amount of time to delay before starting.
/// </summary>
private int m_StartDelay;
private int m_IdleTimeout; private int m_IdleTimeout;
private int m_StackSize; private int m_StackSize;
private int m_SleepTime; private int m_SleepTime;
@ -299,6 +305,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
m_MaxThreads = m_ScriptConfig.GetInt("MaxThreads", 100); m_MaxThreads = m_ScriptConfig.GetInt("MaxThreads", 100);
m_IdleTimeout = m_ScriptConfig.GetInt("IdleTimeout", 60); m_IdleTimeout = m_ScriptConfig.GetInt("IdleTimeout", 60);
string priority = m_ScriptConfig.GetString("Priority", "BelowNormal"); string priority = m_ScriptConfig.GetString("Priority", "BelowNormal");
m_StartDelay = m_ScriptConfig.GetInt("StartDelay", 15000);
m_MaxScriptQueue = m_ScriptConfig.GetInt("MaxScriptEventQueue",300); m_MaxScriptQueue = m_ScriptConfig.GetInt("MaxScriptEventQueue",300);
m_StackSize = m_ScriptConfig.GetInt("ThreadStackSize", 262144); m_StackSize = m_ScriptConfig.GetInt("ThreadStackSize", 262144);
m_SleepTime = m_ScriptConfig.GetInt("MaintenanceInterval", 10) * 1000; m_SleepTime = m_ScriptConfig.GetInt("MaintenanceInterval", 10) * 1000;
@ -957,7 +964,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
{ {
// This delay exists to stop mono problems where script compilation and startup would stop the sim // This delay exists to stop mono problems where script compilation and startup would stop the sim
// working properly for the session. // working properly for the session.
System.Threading.Thread.Sleep(15000); System.Threading.Thread.Sleep(m_StartDelay);
} }
object[] o; object[] o;
@ -1768,12 +1775,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine
public string GetXMLState(UUID itemID) public string GetXMLState(UUID itemID)
{ {
// m_log.DebugFormat("[XEngine]: Getting XML state for {0}", itemID); // m_log.DebugFormat("[XEngine]: Getting XML state for script instance {0}", itemID);
IScriptInstance instance = GetInstance(itemID); IScriptInstance instance = GetInstance(itemID);
if (instance == null) if (instance == null)
{ {
// m_log.DebugFormat("[XEngine]: Found no script for {0}, returning empty string", itemID); // m_log.DebugFormat("[XEngine]: Found no script instance for {0}, returning empty string", itemID);
return ""; return "";
} }
@ -1848,7 +1855,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
tfs.Read(tdata, 0, tdata.Length); tfs.Read(tdata, 0, tdata.Length);
} }
assem = new System.Text.ASCIIEncoding().GetString(tdata); assem = Encoding.ASCII.GetString(tdata);
} }
catch (Exception e) catch (Exception e)
{ {

View File

@ -27,9 +27,10 @@
using System; using System;
using System.IO; using System.IO;
using System.Xml;
using System.Threading;
using System.Reflection; using System.Reflection;
using System.Threading;
using System.Text;
using System.Xml;
using OpenSim.Framework; using OpenSim.Framework;
using OpenSim.Framework.Console; using OpenSim.Framework.Console;
using log4net; using log4net;
@ -335,8 +336,7 @@ namespace OpenSim.Server.Base
{ {
string pidstring = System.Diagnostics.Process.GetCurrentProcess().Id.ToString(); string pidstring = System.Diagnostics.Process.GetCurrentProcess().Id.ToString();
FileStream fs = File.Create(path); FileStream fs = File.Create(path);
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); Byte[] buf = Encoding.ASCII.GetBytes(pidstring);
Byte[] buf = enc.GetBytes(pidstring);
fs.Write(buf, 0, buf.Length); fs.Write(buf, 0, buf.Length);
fs.Close(); fs.Close();
m_pidFile = path; m_pidFile = path;

View File

@ -69,7 +69,7 @@ namespace OpenSim.Tests.Common
} }
/// <summary> /// <summary>
/// Add a blank script to the given part. /// Add a simple script to the given part.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// TODO: Accept input for item and asset IDs to avoid mysterious script failures that try to use any of these /// TODO: Accept input for item and asset IDs to avoid mysterious script failures that try to use any of these
@ -81,6 +81,7 @@ namespace OpenSim.Tests.Common
public static TaskInventoryItem AddScript(Scene scene, SceneObjectPart part) public static TaskInventoryItem AddScript(Scene scene, SceneObjectPart part)
{ {
AssetScriptText ast = new AssetScriptText(); AssetScriptText ast = new AssetScriptText();
ast.Source = "default { state_entry() { llSay(0, \"Hello World\"); } }";
ast.Encode(); ast.Encode();
UUID assetUuid = new UUID("00000000-0000-0000-1000-000000000000"); UUID assetUuid = new UUID("00000000-0000-0000-1000-000000000000");

View File

@ -42,6 +42,57 @@ namespace OpenSim.Tests.Common
{ {
public static readonly string PATH_DELIMITER = "/"; public static readonly string PATH_DELIMITER = "/";
/// <summary>
/// Add an existing scene object as an item in the user's inventory.
/// </summary>
/// <param name='scene'></param>
/// <param name='so'></param>
/// <param name='inventoryIdTail'></param>
/// <param name='assetIdTail'></param>
/// <returns>The inventory item created.</returns>
public static InventoryItemBase AddInventoryItem(
Scene scene, SceneObjectGroup so, int inventoryIdTail, int assetIdTail)
{
return AddInventoryItem(
scene,
so.Name,
TestHelpers.ParseTail(inventoryIdTail),
InventoryType.Object,
AssetHelpers.CreateAsset(TestHelpers.ParseTail(assetIdTail), so),
so.OwnerID);
}
/// <summary>
/// Creates a notecard in the objects folder and specify an item id.
/// </summary>
/// <param name="scene"></param>
/// <param name="itemName"></param>
/// <param name="itemId"></param>
/// <param name="itemType"></param>
/// <param name="asset">The serialized asset for this item</param>
/// <param name="userId"></param>
/// <returns></returns>
private static InventoryItemBase AddInventoryItem(
Scene scene, string itemName, UUID itemId, InventoryType itemType, AssetBase asset, UUID userId)
{
scene.AssetService.Store(asset);
InventoryItemBase item = new InventoryItemBase();
item.Name = itemName;
item.AssetID = asset.FullID;
item.ID = itemId;
item.Owner = userId;
item.AssetType = asset.Type;
item.InvType = (int)itemType;
InventoryFolderBase folder = scene.InventoryService.GetFolderForType(userId, (AssetType)asset.Type);
item.Folder = folder.ID;
scene.AddInventoryItem(item);
return item;
}
/// <summary> /// <summary>
/// Creates a notecard in the objects folder and specify an item id. /// Creates a notecard in the objects folder and specify an item id.
/// </summary> /// </summary>
@ -81,42 +132,27 @@ namespace OpenSim.Tests.Common
/// <param name="type">Type of item to create</param> /// <param name="type">Type of item to create</param>
/// <returns></returns> /// <returns></returns>
public static InventoryItemBase CreateInventoryItem( public static InventoryItemBase CreateInventoryItem(
Scene scene, string itemName, UUID itemId, UUID assetId, UUID userId, InventoryType type) Scene scene, string itemName, UUID itemId, UUID assetId, UUID userId, InventoryType itemType)
{ {
AssetBase asset = null; AssetBase asset = null;
if (type == InventoryType.Notecard) if (itemType == InventoryType.Notecard)
{ {
asset = AssetHelpers.CreateNotecardAsset(); asset = AssetHelpers.CreateNotecardAsset();
asset.CreatorID = userId.ToString(); asset.CreatorID = userId.ToString();
} }
else if (type == InventoryType.Object) else if (itemType == InventoryType.Object)
{ {
asset = AssetHelpers.CreateAsset(assetId, SceneHelpers.CreateSceneObject(1, userId)); asset = AssetHelpers.CreateAsset(assetId, SceneHelpers.CreateSceneObject(1, userId));
} }
else else
{ {
throw new Exception(string.Format("Inventory type {0} not supported", type)); throw new Exception(string.Format("Inventory type {0} not supported", itemType));
} }
scene.AssetService.Store(asset); return AddInventoryItem(scene, itemName, itemId, itemType, asset, userId);
InventoryItemBase item = new InventoryItemBase();
item.Name = itemName;
item.AssetID = asset.FullID;
item.ID = itemId;
item.Owner = userId;
item.AssetType = asset.Type;
item.InvType = (int)type;
InventoryFolderBase folder = scene.InventoryService.GetFolderForType(userId, AssetType.Notecard);
item.Folder = folder.ID;
scene.AddInventoryItem(item);
return item;
} }
/// <summary> /// <summary>
/// Create inventory folders starting from the user's root folder. /// Create inventory folders starting from the user's root folder.
/// </summary> /// </summary>

View File

@ -28,6 +28,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Text;
using Microsoft.CSharp; using Microsoft.CSharp;
using OpenSim.Region.ScriptEngine.Shared.CodeTools; using OpenSim.Region.ScriptEngine.Shared.CodeTools;
using System.CodeDom.Compiler; using System.CodeDom.Compiler;
@ -201,12 +202,8 @@ namespace OpenSim.Tools.LSL.Compiler
// Convert to base64 // Convert to base64
// //
string filetext = System.Convert.ToBase64String(data); string filetext = System.Convert.ToBase64String(data);
Byte[] buf = Encoding.ASCII.GetBytes(filetext);
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); FileStream sfs = File.Create(OutFile + ".text");
Byte[] buf = enc.GetBytes(filetext);
FileStream sfs = File.Create(OutFile+".text");
sfs.Write(buf, 0, buf.Length); sfs.Write(buf, 0, buf.Length);
sfs.Close(); sfs.Close();
@ -222,9 +219,9 @@ namespace OpenSim.Tools.LSL.Compiler
// } // }
// } // }
buf = enc.GetBytes(posmap); buf = Encoding.ASCII.GetBytes(posmap);
FileStream mfs = File.Create(OutFile+".map"); FileStream mfs = File.Create(OutFile + ".map");
mfs.Write(buf, 0, buf.Length); mfs.Write(buf, 0, buf.Length);
mfs.Close(); mfs.Close();

View File

@ -3025,6 +3025,8 @@
<Reference name="OpenSim.Region.Framework"/> <Reference name="OpenSim.Region.Framework"/>
<Reference name="OpenSim.Region.CoreModules"/> <Reference name="OpenSim.Region.CoreModules"/>
<Reference name="OpenSim.Region.Physics.Manager"/> <Reference name="OpenSim.Region.Physics.Manager"/>
<Reference name="OpenSim.Region.ScriptEngine.Shared"/>
<Reference name="OpenSim.Region.ScriptEngine.XEngine"/>
<Reference name="OpenSim.Services.Interfaces"/> <Reference name="OpenSim.Services.Interfaces"/>
<!-- Unit tests --> <!-- Unit tests -->