Difference between revisions of "Smooth Sliding Door"

From Second Life Wiki
Jump to navigation Jump to search
(Added auto-close feature.)
Line 111: Line 111:
     }
     }
}</lsl>
}</lsl>
==The Script with Auto-Close==
[[User:Kira Komarov|Kira Komarov]]: A minor off-spin of the script above would be to add an auto-close feature so that the door slides back after a certain user-defined period of time.
<lsl>
// ********************************************************************
//
// Basic Physical Sliding Door Script
// by SimonT Quinnell edited by Kira Komarov
// for auto-close.
// 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.
//
// Edit: Simplified the script to be just a basic move script .. removed the sound triggers (5/1/2010)
//
// ********************************************************************
// ********************************************************************
// CONSTANTS
// ********************************************************************
// Movement Constants
vector      OFFSET = <-2.0, 0.0, 0.0>;      // Directional offset for moving the door in x,y,z coordinates
float      OPENTIME = 3.5;                // Time taken to open door
float      CLOSETIME = 3.5;                // Time taken to close door
float    AUTO_CLOSE_TIME = 5;              // Time to auto-close the door
// ********************************************************************
// Variables
// ********************************************************************
vector      vPosition;
rotation    rRot;
float      omega=0.0;
vector      vTargetPos;
integer    bOpen = FALSE;
integer    bMoving = FALSE;
integer    destTarget;
// ********************************************************************
// Functions
// ********************************************************************
MoveDoor()
{
    if(!bOpen)
    {  // Initial conditions
        bOpen = TRUE;               
        rRot = llGetRot();
        vPosition = llGetPos();
        // Target Position
        omega=OPENTIME/llVecDist(<0,0,0>,OFFSET);
        vTargetPos = vPosition+OFFSET*rRot;
        // Set the timer to cleanup position
        //llSetTimerEvent(OPENTIME);       
    }else
    {       
        bOpen = FALSE;
        // Target Position
        omega=CLOSETIME/llVecDist(<0,0,0>,OFFSET);
        vTargetPos = vPosition;
        // Set the timer to cleanup position
        //llSetTimerEvent(CLOSETIME);
    }
    // Set Door Physical and move it
    bMoving = TRUE;
    llSetStatus(STATUS_PHANTOM, TRUE);
    llSetStatus(STATUS_PHYSICS, TRUE);
    destTarget = llTarget(vTargetPos, llVecDist(<0,0,0>,OFFSET));
    llMoveToTarget(vTargetPos,omega);
   
}
default
{           
    state_entry()
    {  // Initial conditions
        rRot = llGetRot();
        vPosition = llGetPos();
    }   
    at_target(integer tnum, vector targetpos, vector ourpos) {
        if(llVecDist(targetpos, ourpos) < 0.1) {
            // Clean up Position
            bMoving = FALSE;
            llSetStatus(STATUS_PHYSICS, FALSE);
            llSetStatus(STATUS_PHANTOM, FALSE);       
            llSetPrimitiveParams([ PRIM_POSITION, vTargetPos, PRIM_ROTATION, rRot ]);
            llTargetRemove(destTarget);
            if(bOpen) {
                llSetTimerEvent(AUTO_CLOSE_TIME);
            }
        }
    }
    touch_start(integer num_detected)
    {
        MoveDoor();
    }
    timer()
    {
        llSetTimerEvent(0.0);
        MoveDoor();
    }
}
</lsl>


==See also==
==See also==
*[[ Script_Library | Script Library ]]
*[[ Script_Library | Script Library ]]
[[Category:LSL Library|Smooth Sliding Door Script]]
[[Category:LSL Library|Smooth Sliding Door Script]]

Revision as of 07:35, 17 June 2011

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 sometimes seeming to zoom off to the side before popping into the correct final position 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. // // Edit: Simplified the script to be just a basic move script .. removed the sound triggers (5/1/2010) // // ********************************************************************


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

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


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

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


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


MoveDoor() {

   if(!bOpen)
   {   // Initial conditions
       bOpen = TRUE;                
       rRot = llGetRot();
       vPosition = llGetPos();
       
       // Target Position
       omega=OPENTIME/llVecDist(<0,0,0>,OFFSET);
       vTargetPos = vPosition+OFFSET*rRot;
       
       // Set the timer to cleanup position
       llSetTimerEvent(OPENTIME);        
   }else
   {        
       bOpen = FALSE;
       // Target Position
       omega=CLOSETIME/llVecDist(<0,0,0>,OFFSET);
       vTargetPos = vPosition;
       
       // Set the timer to cleanup position
       llSetTimerEvent(CLOSETIME);
   }
   
   // 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)
   {
       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>

The Script with Auto-Close

Kira Komarov: A minor off-spin of the script above would be to add an auto-close feature so that the door slides back after a certain user-defined period of time.

<lsl> // ******************************************************************** // // Basic Physical Sliding Door Script // by SimonT Quinnell edited by Kira Komarov // for auto-close. // 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. // // Edit: Simplified the script to be just a basic move script .. removed the sound triggers (5/1/2010) // // ********************************************************************


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

// Movement Constants vector OFFSET = <-2.0, 0.0, 0.0>; // Directional offset for moving the door in x,y,z coordinates float OPENTIME = 3.5; // Time taken to open door float CLOSETIME = 3.5; // Time taken to close door float AUTO_CLOSE_TIME = 5; // Time to auto-close the door

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

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

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


MoveDoor() {

   if(!bOpen)
   {   // Initial conditions
       bOpen = TRUE;                
       rRot = llGetRot();
       vPosition = llGetPos();

       // Target Position
       omega=OPENTIME/llVecDist(<0,0,0>,OFFSET);
       vTargetPos = vPosition+OFFSET*rRot;

       // Set the timer to cleanup position
       //llSetTimerEvent(OPENTIME);        
   }else
   {        
       bOpen = FALSE;

       // Target Position
       omega=CLOSETIME/llVecDist(<0,0,0>,OFFSET);
       vTargetPos = vPosition;

       // Set the timer to cleanup position
       //llSetTimerEvent(CLOSETIME);
   }

   // Set Door Physical and move it
   bMoving = TRUE;
   llSetStatus(STATUS_PHANTOM, TRUE);
   llSetStatus(STATUS_PHYSICS, TRUE);
   destTarget = llTarget(vTargetPos, llVecDist(<0,0,0>,OFFSET));
   llMoveToTarget(vTargetPos,omega);
   

}


default {

   state_entry()
   {   // Initial conditions
       rRot = llGetRot();
       vPosition = llGetPos();
   }    
   at_target(integer tnum, vector targetpos, vector ourpos) {
       if(llVecDist(targetpos, ourpos) < 0.1) {
           // Clean up Position
           bMoving = FALSE;
           llSetStatus(STATUS_PHYSICS, FALSE);
           llSetStatus(STATUS_PHANTOM, FALSE);         
           llSetPrimitiveParams([ PRIM_POSITION, vTargetPos, PRIM_ROTATION, rRot ]);
           llTargetRemove(destTarget);
           if(bOpen) {
               llSetTimerEvent(AUTO_CLOSE_TIME);
           }
       }
   }
   touch_start(integer num_detected)
   {
       MoveDoor();
   } 

   timer()
   {
       llSetTimerEvent(0.0);
       MoveDoor();
   }

} </lsl>

See also