Difference between revisions of "Smooth Sliding Door"
(Created page with '{{LSL Header}} 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 f...') |
|||
Line 15: | Line 15: | ||
// by SimonT Quinnell | // by SimonT Quinnell | ||
// 11/07/2009 | // 11/07/2009 | ||
// | // | ||
// NOTE: If you are going to reposition the door, do it while the door is closed. | // NOTE: If you are going to reposition the door, do it while the door is closed. | ||
Line 31: | Line 29: | ||
// ******************************************************************** | // ******************************************************************** | ||
// Movement Constants | // Movement Constants | ||
vector OFFSET = <-2.0, 0.0, 0.0>; // Directional offset for moving the door | vector OFFSET = <-2.0, 0.0, 0.0>; // Directional offset for moving the door | ||
Line 46: | Line 43: | ||
// Misc. Constants | // Misc. Constants | ||
float MAX_DISTANCE = 10.00; // Maximum distance the touching avatar can be away | float MAX_DISTANCE = 10.00; // Maximum distance the touching avatar can be away | ||
Line 58: | Line 54: | ||
vector vTargetPos; | vector vTargetPos; | ||
integer bOpen = FALSE; | integer bOpen = FALSE; | ||
integer bMoving = FALSE; | |||
// ******************************************************************** | // ******************************************************************** | ||
// Functions | // Functions | ||
// ******************************************************************** | // ******************************************************************** | ||
Line 137: | Line 92: | ||
// Set Door Physical and move it | // Set Door Physical and move it | ||
bMoving = TRUE; | |||
llSetStatus(STATUS_PHANTOM, TRUE); | llSetStatus(STATUS_PHANTOM, TRUE); | ||
llSetStatus(STATUS_PHYSICS, TRUE); | llSetStatus(STATUS_PHYSICS, TRUE); | ||
Line 146: | Line 102: | ||
{ | { | ||
state_entry() | state_entry() | ||
{ | { // Initial conditions | ||
rRot = llGetRot(); | |||
vPosition = llGetPos(); | |||
} | |||
} | |||
touch_start(integer num_detected) | touch_start(integer num_detected) | ||
Line 208: | Line 112: | ||
float distance = llVecDist(llGetPos(),llDetectedPos(0)); | float distance = llVecDist(llGetPos(),llDetectedPos(0)); | ||
if (distance < MAX_DISTANCE | if (distance < MAX_DISTANCE && !bMoving) MoveDoor(); | ||
} | } | ||
timer() | timer() | ||
{ | { | ||
// Clean up Position | // Clean up Position | ||
bMoving = FALSE; | |||
llSetTimerEvent(0.0); | |||
llSetStatus(STATUS_PHYSICS, FALSE); | llSetStatus(STATUS_PHYSICS, FALSE); | ||
llSetStatus(STATUS_PHANTOM, FALSE); | llSetStatus(STATUS_PHANTOM, FALSE); | ||
llSetPrimitiveParams([ PRIM_POSITION, vTargetPos, PRIM_ROTATION, rRot ]); | llSetPrimitiveParams([ PRIM_POSITION, vTargetPos, PRIM_ROTATION, rRot ]); | ||
} | } | ||
}</lsl> | }</lsl> |
Revision as of 22:33, 10 July 2009
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
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>
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>