Difference between revisions of "Smooth Sliding Door"

From Second Life Wiki
Jump to navigation Jump to search
Line 126: Line 126:
}</lsl>
}</lsl>


==Example Configuration Notecard==
<lsl># Configuration Notecard for Physical Door
# Touching
max_distance = 10.0
# Door Action Details
offset = <3.5,0.0,0.0>
open_time = 4.0
close_time = 4.0
# Door Sound Details
open_sound =
open_volume = 1.0
close_sound = 
close_volume = 1.0</lsl>


==See also==
==See also==
*[[ Script_Library | Script Library ]]
*[[ Script_Library | Script Library ]]

Revision as of 23:33, 10 July 2009

Smooth Sliding Door Script

Introduction

It really annoys me that there are so many bad looking doors out there that jerk around. While you can use llSetPos for a sliding door you have no control at what speed it moves. This sliding door script i created because i wanted to time my sliding door movements with the door sounds i had. It uses llMoveToTarget to move the door, with the door temporally turning phantom as it moves.

In laggy sims it will behave a little bit funky .. the door somtimes seeming to zoom off to the side as the door becomes a physical object. However, even with that defect it still looks much better IMHO

The Script

<lsl> // ******************************************************************** // // Basic Physical Sliding Door Script // by SimonT Quinnell // 11/07/2009 // // NOTE: If you are going to reposition the door, do it while the door is closed. // Otherwise it will try and use the old close position as a reference point. // // Licensed under the "OpenCollar License" // Ie. Licensed under the GPLv2, with the additional requirement that these scripts remain "full perms" in Second Life. // // ********************************************************************


// ******************************************************************** // CONSTANTS // ********************************************************************

// Movement Constants vector OFFSET = <-2.0, 0.0, 0.0>; // Directional offset for moving the door float OPENTIME = 3.5; // Time taken to open door float CLOSETIME = 3.5; // Time taken to close door


// Sound/volume to play on open and close, either a UUID or a name in the door contents string OPENSOUND = ""; float OPENVOL = 1.0; string CLOSESOUND = ""; float CLOSEVOL = 1.0;

// Misc. Constants float MAX_DISTANCE = 10.00; // Maximum distance the touching avatar can be away


// ******************************************************************** // Variables // ********************************************************************

vector vPosition; rotation rRot; float omega=0.0; vector vTargetPos; integer bOpen = FALSE; integer bMoving = FALSE;


// ******************************************************************** // Functions // ********************************************************************


MoveDoor() {

   if(!bOpen)
   {   // Initial conditions
       rRot = llGetRot();
       vPosition = llGetPos();
       
       // Target Position
       omega=OPENTIME/llVecDist(<0,0,0>,OFFSET);
       vTargetPos = vPosition+OFFSET*rRot;
       
       // Set the timer to cleanup position .. nesessary for laggy sims
       llSetTimerEvent(OPENTIME);
       
       bOpen = TRUE;                
       if(OPENSOUND != "") llTriggerSound(OPENSOUND, OPENVOL);
   }else
   {        
       // Target Position
       omega=CLOSETIME/llVecDist(<0,0,0>,OFFSET);
       vTargetPos = vPosition;
       
       // Set the timer to cleanup position .. nesessary for laggy sims
       llSetTimerEvent(CLOSETIME);
       bOpen = FALSE;
       if(CLOSESOUND != "") llTriggerSound(CLOSESOUND, CLOSEVOL);                       
   }
   
   // Set Door Physical and move it
   bMoving = TRUE;
   llSetStatus(STATUS_PHANTOM, TRUE);
   llSetStatus(STATUS_PHYSICS, TRUE);
   llMoveToTarget(vTargetPos,omega);

}


default {

   state_entry()
   {   // Initial conditions
       rRot = llGetRot();
       vPosition = llGetPos();
   }    
       
   touch_start(integer num_detected)
   {
       key         keyTouchingAvatar = llDetectedKey(0);
       float       distance = llVecDist(llGetPos(),llDetectedPos(0));
       if (distance < MAX_DISTANCE && !bMoving) MoveDoor();
   } 
       
   timer()
   {
       // Clean up Position
       bMoving = FALSE;
       llSetTimerEvent(0.0);
       llSetStatus(STATUS_PHYSICS, FALSE);
       llSetStatus(STATUS_PHANTOM, FALSE);         
       llSetPrimitiveParams([ PRIM_POSITION, vTargetPos, PRIM_ROTATION, rRot ]);        
   }

}</lsl>


See also