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 ...)
 
(Mouselook)
Line 6: Line 6:


== Code ==
== Code ==
<br style="clear:both"/>


<lsl>
<lsl>

Revision as of 00:45, 15 February 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.

Code


<lsl> // Code by Maike Short based on an inoffical protocol extension by Monica Jewell


integer RLV_LINK_CHANNEL = -1373421301;

integer mouselook = FALSE; // should the sub be in mouselook? 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?

// punish 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("@edit=n");

}

// undo the punishment release() {

   llSetPrimitiveParams([PRIM_SIZE, <0, 0, 0>]);
   llSetAlpha(0, ALL_SIDES);
   llOwnerSay("@edit=y");

}

// enforce mouselook handleMouselook() {

   // first of all check that mouselook is enforced
   if (!mouselook)
   {
       llSetTimerEvent(0);
       mouselookTicks = 0;
       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)
   {
       release();
   }
   else
   {
       punish();
   }
   // remember whether we punished or lifted the punisment
   mouselookLast = mouselookIn;

}

default {

   state_entry()
   {
       release();
   }    
   on_rez(integer i)
   {
       if (mouselook)
       {
           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;
       }
       if ((message == "@thirdview=y") || (message == "@clear"))
       {
           // lift mouselook enforcement
           llSetTimerEvent(0);
           mouselook = FALSE;
           release();
       }
       else if (message == "@thirdview=n")
       {
           // start mouselook enforcement
           mouselook = TRUE;
           mouselookLast = TRUE;
           handleMouselook();
           llSetTimerEvent(1);
       }
   }
   // 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>