LSL Protocol/Restrained Life Relay/Mouselook: Difference between revisions

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 ...
(No difference)

Revision as of 00:44, 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>