Skip to content

llRequestExperiencePermissions

Requires Experience
void llRequestExperiencePermissions(key AgentID, string unused)

Ask the agent for permission to participate in an experience. This request is similar to llRequestPermissions with the following permissions: PERMISSION_TAKE_CONTROLS, PERMISSION_TRIGGER_ANIMATION, PERMISSION_ATTACH, PERMISSION_TRACK_CAMERA, PERMISSION_CONTROL_CAMERA and PERMISSION_TELEPORT. However, unlike llRequestPermissions the decision to allow or block the request is persistent and applies to all scripts using the experience grid wide. Subsequent calls to llRequestExperiencePermissions from scripts in the experience will receive the same response automatically with no user interaction. One of experience_permissions or experience_permissions_denied will be generated in response to this call. Outstanding permission requests will be lost if the script is derezzed, moved to another region or reset.

Parameters
AgentID (key)
unused (string)
Not used, should be ""

This function requests permission from an agent to participate in an experience. Unlike llRequestPermissions, the decision is persistent and applies grid-wide to all scripts using the experience.

Subsequent calls to llRequestExperiencePermissions from scripts in the same experience will automatically receive the same response with no user interaction required.

Either experience_permissions or experience_permissions_denied events will be generated in response. If the agent doesn’t respond, the request will time out after at least 5 minutes. Multiple requests can be made during this timeout, though a script can only have permission for one agent at a time.

Agents in god mode will always see the permission dialog even if the experience has been previously approved.

  • Outstanding permission requests are lost if the script is rezzed, moved to another region, or reset
  • The script can only have permission for one agent at a time
  • Permission requests timeout after at least 5 minutes of inactivity
  • The name parameter is deprecated and no longer used

This script detects an avatar by collision and rezzes an object that will request experience permissions and attach to the avatar:

default
{
state_entry()
{
llVolumeDetect(TRUE);
}
collision_start(integer NumberOfCollisions)
{
integer i = 0;
for(; i < NumberOfCollisions; i++)
{
integer channel = llRound(llFrand(-1000));
key give_to = llDetectedKey(i);
llSay(0, "Rezzing HUD for " + (string)give_to + " using channel " + (string)channel);
llRezObject(llGetInventoryName(INVENTORY_OBJECT, 0), llGetPos(), ZERO_VECTOR, ZERO_ROTATION, channel);
llRegionSay(channel, "ATTACH|" + (string)give_to);
}
}
}

This script runs on an object that is rezzed in-world, requests experience permissions, and attaches to an avatar. It handles failures like denied permissions and attachment failures:

// Example script for LSL Experience Tools attachment
// This script runs on an object that is rezzed in-world which gets
// an Experience permissions and then attaches to an AV.
integer listener;
integer msg_channel;
integer log_spam_channel = 0; // Change this or remove llSay() commands
default
{
on_rez(integer start_parameter)
{ // Start listening for a message from rezzer
msg_channel = start_parameter;
llSay(log_spam_channel, "Test HUD has been rezzed");
listener = llListen(start_parameter, "", NULL_KEY, "");
}
listen(integer channel, string name, key id, string text)
{ // Listen for the message from the rezzer with the target agent key
if (channel == msg_channel)
{ // Ask for the experience permission
list msg = llParseString2List(text, ["|"], []);
llSay(log_spam_channel, "Trying experience permissions request to " + llList2String(msg, 1));
llRequestExperiencePermissions((key)llList2String(msg, 1), "");
llListenRemove(listener);
llSetTimerEvent(60.0);
}
}
experience_permissions(key target_id)
{ // Permissions granted, so attach to the AV
llSay(log_spam_channel, "Trying llAttachToAvatarTemp()");
llAttachToAvatarTemp(ATTACH_HUD_CENTER_1);
llSay(log_spam_channel, "After llAttachToAvatarTemp() with llGetAttached() returning " + (string)llGetAttached());
llSetTimerEvent(0.0);
if (llGetAttached() == 0)
{ // Attaching failed
llDie();
}
}
experience_permissions_denied( key agent_id, integer reason )
{ // Permissions denied, so go away
llSay(log_spam_channel, "Denied experience permissions for " + (string)agent_id + " due to reason #" + (string) reason);
llDie();
}
attach( key id )
{ // Attached or detached from the avatar
if (id)
{
llSetTimerEvent(0.0);
llSay(log_spam_channel, "Now attached with a key " + (string)id + " and llGetAttached() returning " + (string)llGetAttached());
// From this point, the object can start doing whatever it needs to do.
state running;
}
else
{
llSay(log_spam_channel, "No longer attached");
llDie();
}
}
timer()
{ // Use a timer to catch no permissions response
llSay(log_spam_channel, "Permissions timer expired");
llDie();
}
}
// This state starts when permissions are granted, and the object is properly attached
state running
{
state_entry()
{
llSay(log_spam_channel, "off and running!");
}
attach(key id)
{
if (id == NULL_KEY)
{ // if the object ever un-attaches, make sure it deletes itself
llSay(log_spam_channel, "No longer attached");
llDie();
}
}
}