Difference between revisions of "LSL Protocol/Restrained Life Relay/Mouselook"

From Second Life Wiki
Jump to navigation Jump to search
(New page: {{Restrained Life Relay Specs TOC}} 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 ...)
 
(multi prim support)
 
(One intermediate revision by the same user not shown)
Line 4: Line 4:


'''Note:''' @thirdview=n is an inoffical command. It has never been part of the specification and might be replaced by a meta command.
'''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 ==
== Code ==
<br style="clear:both"/>


<lsl>
<lsl>
// Mouselook script for RestrainedLife Viewer Relay
//
// Code by Maike Short based on an inoffical protocol extension by Monica Jewell
// 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;
integer RLV_LINK_CHANNEL = -1373421301;


integer mouselook = FALSE;     // should the sub be in mouselook?
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 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?
integer mouselookLast = TRUE;  // was the sub in mouselook during last check?


// punish the sub
// is mouselook required
integer mouselookRequired()
{
    return llGetListLength(mouselookRequests) > 0;
}
 
 
// punishes the sub
punish()
punish()
{
{
Line 29: Line 57:
     llSetPrimitiveParams([PRIM_SIZE, <10, 10, 10>]);
     llSetPrimitiveParams([PRIM_SIZE, <10, 10, 10>]);
     llSetAlpha(1, ALL_SIDES);
     llSetAlpha(1, ALL_SIDES);
     llOwnerSay("@edit=n");
     llOwnerSay("@detach=n,edit=n");
}
}


// undo the punishment
// undos the punishment
release()
lift()
{
{
     llSetPrimitiveParams([PRIM_SIZE, <0, 0, 0>]);
     llSetPrimitiveParams([PRIM_SIZE, <0, 0, 0>]);
     llSetAlpha(0, ALL_SIDES);
     llSetAlpha(0, ALL_SIDES);
     llOwnerSay("@edit=y");
     llOwnerSay("@detach=y,edit=y");
}
}


// enforce mouselook
// releases mouselook requirement
release()
{
    llSetTimerEvent(0);
    mouselookTicks = 0;
    lift();
}
 
// check whether the avatar is in mouselook and take appropriate actions
handleMouselook()
handleMouselook()
{
{
     // first of all check that mouselook is enforced
     // first of all check that mouselook is enforced
     if (!mouselook)
     if (!mouselookRequired())
     {
     {
        llSetTimerEvent(0);
        mouselookTicks = 0;
         release();
         release();
         return;
         return;
Line 75: Line 109:
     if (mouselookIn)
     if (mouselookIn)
     {
     {
         release();
         lift();
     }
     }
     else
     else
Line 85: Line 119:
     mouselookLast = mouselookIn;
     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 {
default {
     state_entry()
     state_entry()
     {
     {
        llSetColor(<0, 0, 0>, ALL_SIDES);
        llSetTexture(TEXTURE_BLANK, ALL_SIDES);
         release();
         release();
     }     
     }     
Line 94: Line 168:
     on_rez(integer i)
     on_rez(integer i)
     {
     {
         if (mouselook)
         if (mouselookRequired())
         {
         {
             llOwnerSay("Go to mouselook or stay blind");
             llOwnerSay("Go to mouselook or stay blind");
Line 112: Line 186:
         }
         }


        message = llToLower(message);
         if ((message == "@thirdview=y") || (message == "@clear"))
         if ((message == "@thirdview=y") || (message == "@clear"))
         {
         {
             // lift mouselook enforcement
             processReleaseRequest(sender);
            llSetTimerEvent(0);
            mouselook = FALSE;
            release();
         }
         }
         else if (message == "@thirdview=n")
         else if (message == "@thirdview=n")
         {
         {
             // start mouselook enforcement
             processMouselookRequest(sender);
            mouselook = TRUE;
            mouselookLast = TRUE;
            handleMouselook();
            llSetTimerEvent(1);
         }
         }
     }
     }

Latest revision as of 12:09, 7 March 2009

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>