// ********************************************************************
//
// 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();
}
}