llRequestExperiencePermissions
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.
Caveats
Section titled “Caveats”- 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
nameparameter is deprecated and no longer used
Examples
Section titled “Examples”HUD Dispenser Shell
Section titled “HUD Dispenser Shell”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); } }}Experience Permissions and Attachment
Section titled “Experience Permissions and Attachment”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 attachedstate 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(); } }}See Also
Section titled “See Also”experience_permissionseventexperience_permissions_deniedevent- llRequestPermissions