This script allows an object to be attached directly from prim inventory to another avatar in the scene.
Very useful in serious game/environment scenarios where its only allowed for trusted creators. Threat level Severe0.7.4.1
parent
d6f563794e
commit
c8af20f966
|
@ -3190,13 +3190,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
{
|
{
|
||||||
CheckThreatLevel(ThreatLevel.High, "osForceAttachToAvatarFromInventory");
|
CheckThreatLevel(ThreatLevel.High, "osForceAttachToAvatarFromInventory");
|
||||||
|
|
||||||
|
m_host.AddScriptLPS(1);
|
||||||
|
|
||||||
|
ForceAttachToAvatarFromInventory(m_host.OwnerID, itemName, attachmentPoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void osForceAttachToOtherAvatarFromInventory(string rawAvatarId, string itemName, int attachmentPoint)
|
||||||
|
{
|
||||||
|
CheckThreatLevel(ThreatLevel.Severe, "osForceAttachToOtherAvatarFromInventory");
|
||||||
|
|
||||||
|
m_host.AddScriptLPS(1);
|
||||||
|
|
||||||
|
UUID avatarId;
|
||||||
|
|
||||||
|
if (!UUID.TryParse(rawAvatarId, out avatarId))
|
||||||
|
return;
|
||||||
|
|
||||||
|
ForceAttachToAvatarFromInventory(avatarId, itemName, attachmentPoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ForceAttachToAvatarFromInventory(UUID avatarId, string itemName, int attachmentPoint)
|
||||||
|
{
|
||||||
IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
|
IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
|
||||||
|
|
||||||
if (attachmentsModule == null)
|
if (attachmentsModule == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_host.AddScriptLPS(1);
|
|
||||||
|
|
||||||
InitLSL();
|
InitLSL();
|
||||||
|
|
||||||
TaskInventoryItem item = m_host.Inventory.GetInventoryItem(itemName);
|
TaskInventoryItem item = m_host.Inventory.GetInventoryItem(itemName);
|
||||||
|
@ -3219,7 +3238,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ScenePresence sp = World.GetScenePresence(m_host.OwnerID);
|
ScenePresence sp = World.GetScenePresence(avatarId);
|
||||||
|
|
||||||
if (sp == null)
|
if (sp == null)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -101,18 +101,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
|
||||||
// Attachment commands
|
// Attachment commands
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Attach the object containing this script to the avatar that owns it without checking for PERMISSION_ATTACH
|
/// Attach the object containing this script to the avatar that owns it without asking for PERMISSION_ATTACH
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name='attachment'>The attachment point. For example, ATTACH_CHEST</param>
|
/// <param name='attachment'>The attachment point. For example, ATTACH_CHEST</param>
|
||||||
void osForceAttachToAvatar(int attachment);
|
void osForceAttachToAvatar(int attachment);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Attach the inventory item in the object containing this script to the avatar that owns it without checking for PERMISSION_ATTACH
|
/// Attach an inventory item in the object containing this script to the avatar that owns it without asking for PERMISSION_ATTACH
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Nothing happens if the owner is not in the region.
|
||||||
|
/// </remarks>
|
||||||
/// <param name='itemName'>Tha name of the item. If this is not found then a warning is said to the owner</param>
|
/// <param name='itemName'>Tha name of the item. If this is not found then a warning is said to the owner</param>
|
||||||
/// <param name='attachment'>The attachment point. For example, ATTACH_CHEST</param>
|
/// <param name='attachment'>The attachment point. For example, ATTACH_CHEST</param>
|
||||||
void osForceAttachToAvatarFromInventory(string itemName, int attachment);
|
void osForceAttachToAvatarFromInventory(string itemName, int attachment);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Attach an inventory item in the object containing this script to any avatar in the region without asking for PERMISSION_ATTACH
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Nothing happens if the avatar is not in the region.
|
||||||
|
/// </remarks>
|
||||||
|
/// <param name='rawAvatarId'>The UUID of the avatar to which to attach. Nothing happens if this is not a UUID</para>
|
||||||
|
/// <param name='itemName'>The name of the item. If this is not found then a warning is said to the owner</param>
|
||||||
|
/// <param name='attachment'>The attachment point. For example, ATTACH_CHEST</param>
|
||||||
|
void osForceAttachToOtherAvatarFromInventory(string rawAvatarId, string itemName, int attachmentPoint);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Detach the object containing this script from the avatar it is attached to without checking for PERMISSION_ATTACH
|
/// Detach the object containing this script from the avatar it is attached to without checking for PERMISSION_ATTACH
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -301,6 +301,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
|
||||||
m_OSSL_Functions.osForceAttachToAvatarFromInventory(itemName, attachmentPoint);
|
m_OSSL_Functions.osForceAttachToAvatarFromInventory(itemName, attachmentPoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void osForceAttachToOtherAvatarFromInventory(string rawAvatarId, string itemName, int attachmentPoint)
|
||||||
|
{
|
||||||
|
m_OSSL_Functions.osForceAttachToOtherAvatarFromInventory(rawAvatarId, itemName, attachmentPoint);
|
||||||
|
}
|
||||||
|
|
||||||
public void osForceDetachFromAvatar()
|
public void osForceDetachFromAvatar()
|
||||||
{
|
{
|
||||||
m_OSSL_Functions.osForceDetachFromAvatar();
|
m_OSSL_Functions.osForceDetachFromAvatar();
|
||||||
|
|
|
@ -174,5 +174,58 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
|
||||||
List<AvatarAttachment> attachmentsInAppearance = sp.Appearance.GetAttachments();
|
List<AvatarAttachment> attachmentsInAppearance = sp.Appearance.GetAttachments();
|
||||||
Assert.That(attachmentsInAppearance.Count, Is.EqualTo(0));
|
Assert.That(attachmentsInAppearance.Count, Is.EqualTo(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestOsForceAttachToOtherAvatarFromInventory()
|
||||||
|
{
|
||||||
|
TestHelpers.InMethod();
|
||||||
|
TestHelpers.EnableLogging();
|
||||||
|
|
||||||
|
string taskInvObjItemName = "sphere";
|
||||||
|
UUID taskInvObjItemId = UUID.Parse("00000000-0000-0000-0000-100000000000");
|
||||||
|
AttachmentPoint attachPoint = AttachmentPoint.Chin;
|
||||||
|
|
||||||
|
UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(m_scene, "user", "one", 0x1, "pass");
|
||||||
|
UserAccount ua2 = UserAccountHelpers.CreateUserWithInventory(m_scene, "user", "two", 0x2, "pass");
|
||||||
|
|
||||||
|
ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, ua1);
|
||||||
|
SceneObjectGroup inWorldObj = SceneHelpers.AddSceneObject(m_scene, "inWorldObj", ua1.PrincipalID);
|
||||||
|
TaskInventoryItem scriptItem = TaskInventoryHelpers.AddScript(m_scene, inWorldObj.RootPart);
|
||||||
|
|
||||||
|
new LSL_Api().Initialize(m_engine, inWorldObj.RootPart, scriptItem);
|
||||||
|
OSSL_Api osslApi = new OSSL_Api();
|
||||||
|
osslApi.Initialize(m_engine, inWorldObj.RootPart, scriptItem);
|
||||||
|
|
||||||
|
// Create an object embedded inside the first
|
||||||
|
TaskInventoryHelpers.AddSceneObject(m_scene, inWorldObj.RootPart, taskInvObjItemName, taskInvObjItemId, ua1.PrincipalID);
|
||||||
|
|
||||||
|
ScenePresence sp2 = SceneHelpers.AddScenePresence(m_scene, ua2);
|
||||||
|
|
||||||
|
osslApi.osForceAttachToOtherAvatarFromInventory(sp2.UUID.ToString(), taskInvObjItemName, (int)attachPoint);
|
||||||
|
|
||||||
|
// Check scene presence status
|
||||||
|
Assert.That(sp.HasAttachments(), Is.False);
|
||||||
|
List<SceneObjectGroup> attachments = sp.GetAttachments();
|
||||||
|
Assert.That(attachments.Count, Is.EqualTo(0));
|
||||||
|
|
||||||
|
Assert.That(sp2.HasAttachments(), Is.True);
|
||||||
|
List<SceneObjectGroup> attachments2 = sp2.GetAttachments();
|
||||||
|
Assert.That(attachments2.Count, Is.EqualTo(1));
|
||||||
|
SceneObjectGroup attSo = attachments2[0];
|
||||||
|
Assert.That(attSo.Name, Is.EqualTo(taskInvObjItemName));
|
||||||
|
Assert.That(attSo.OwnerID, Is.EqualTo(ua2.PrincipalID));
|
||||||
|
Assert.That(attSo.AttachmentPoint, Is.EqualTo((uint)attachPoint));
|
||||||
|
Assert.That(attSo.IsAttachment);
|
||||||
|
Assert.That(attSo.UsesPhysics, Is.False);
|
||||||
|
Assert.That(attSo.IsTemporary, Is.False);
|
||||||
|
|
||||||
|
// Check appearance status
|
||||||
|
List<AvatarAttachment> attachmentsInAppearance = sp.Appearance.GetAttachments();
|
||||||
|
Assert.That(attachmentsInAppearance.Count, Is.EqualTo(0));
|
||||||
|
|
||||||
|
List<AvatarAttachment> attachmentsInAppearance2 = sp2.Appearance.GetAttachments();
|
||||||
|
Assert.That(attachmentsInAppearance2.Count, Is.EqualTo(1));
|
||||||
|
Assert.That(sp2.Appearance.GetAttachpoint(attachmentsInAppearance2[0].ItemID), Is.EqualTo((uint)attachPoint));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue