LSL Protocol/Restrained Life Relay/Mouselook
Put this script into a small child prim of the relay. It will resize this prim to full size if the victim does not stay in mouselook while urged to do so.
Note: @thirdview=n is an inoffical command. It has never been part of the specification and might be replaced by a meta command.
Change Log
1.040
- multi prim relay support
Code
<lsl> // Mouselook script for RestrainedLife Viewer Relay // // Code by Maike Short based on an inoffical protocol extension by Monica Jewell // // Please reports problems to // https://wiki.secondlife.com/wiki/LSL_Protocol/Restrained_Life_Relay/Bugs_and_Pendings_Features // // This script is provided AS-IS, OPEN-SOURCE and holds NO WARRANTY of accuracy, completeness // or performance. It may be distributed in its full source code with this header and // disclaimer and is not to be sold without permission. Optionally it may be distributed // in a 'no mod' form within Second Life™ PROVIDED that either a link to the full source // IS provided (ie. this page or a .zip or .rar) within the object the code is contained // AND/OR a off-world contact point (ie. email) that the source code may be requested from. // This somewhat unusual (no-mod) distribution is allowed to maintain the integrity and // reliability of the creator reference of in-world objects (scripts). Changes and // improvement to this code must be shared with the community so that we ALL benefit.
integer RLV_LINK_CHANNEL = -1373421301;
list mouselookRequests = []; // a list of prims that requested mouselook enforcement integer mouselookTicks = 0; // count the timer ticks until the next reminder message is printed again integer mouselookLast = TRUE; // was the sub in mouselook during last check?
// is mouselook required integer mouselookRequired() {
return llGetListLength(mouselookRequests) > 0;
}
// punishes the sub
punish()
{
// ensure that we are attached to the HUD // we don't want a 10x10x10 black prim in world integer point = llGetAttached(); if ((point < ATTACH_HUD_CENTER_2) || (point > ATTACH_HUD_BOTTOM_RIGHT)) { return; } llSetPrimitiveParams([PRIM_SIZE, <10, 10, 10>]); llSetAlpha(1, ALL_SIDES); llOwnerSay("@detach=n,edit=n");
}
// undos the punishment lift() {
llSetPrimitiveParams([PRIM_SIZE, <0, 0, 0>]); llSetAlpha(0, ALL_SIDES); llOwnerSay("@detach=y,edit=y");
}
// releases mouselook requirement release() {
llSetTimerEvent(0); mouselookTicks = 0; lift();
}
// check whether the avatar is in mouselook and take appropriate actions handleMouselook() {
// first of all check that mouselook is enforced if (!mouselookRequired()) { release(); return; }
// good, now check that the avatar is in mouselook integer data = llGetAgentInfo(llGetOwner()); integer mouselookIn = (data & AGENT_MOUSELOOK); if (!mouselookIn) { if (mouselookTicks % 60 == 0) { llOwnerSay("Go to mouselook or stay blind."); } mouselookTicks++; }
// if we are still in mouselook, or if we are still not in mouselook, // the HUD will still be in the correct state if (mouselookIn == mouselookLast) { // no need to mess with the prim return; }
// something has changed, either punish or lift the punishment if (mouselookIn) { lift(); } else { punish(); }
// remember whether we punished or lifted the punisment mouselookLast = mouselookIn;
}
// process the request to start mouselook enforcement
processMouselookRequest(integer sender)
{
if (llListFindList(mouselookRequests, [sender]) < 0) { mouselookRequests += sender; } mouselookLast = TRUE; handleMouselook(); llSetTimerEvent(1);
}
// process the request to release mouselook enforcement processReleaseRequest(integer sender) {
if (sender == LINK_ROOT) { // a clear from the root prim means, that the complete relay was reset mouselookRequests = []; } else { integer pos = llListFindList(mouselookRequests, [sender]); if (pos > -1) { mouselookRequests = llDeleteSubList(mouselookRequests, pos, pos); } }
// if no one wants mouselook anymore, release it if (!mouselookRequired()) { release(); }
}
default {
state_entry() { llSetColor(<0, 0, 0>, ALL_SIDES); llSetTexture(TEXTURE_BLANK, ALL_SIDES); release(); }
on_rez(integer i) { if (mouselookRequired()) { llOwnerSay("Go to mouselook or stay blind"); }
// get mouselook code into correct state mouselookLast = TRUE; handleMouselook(); }
// handle commands link_message(integer sender, integer channel, string message, key id) { if (channel != RLV_LINK_CHANNEL) { return; }
message = llToLower(message); if ((message == "@thirdview=y") || (message == "@clear")) { processReleaseRequest(sender); } else if (message == "@thirdview=n") { processMouselookRequest(sender); } }
// check if the sub obeys while mouselook is enforced timer() { handleMouselook(); }
// we don't want a nasty surprise for the next owner changed(integer change) { if (change & CHANGED_OWNER) { llResetScript(); } }
} </lsl>