Simple Elevator in a Box
Revision as of 08:07, 25 January 2015 by ObviousAltIsObvious Resident (talk | contribs) (<lsl> tag to <source>)
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
This is a vary simple elevator script, and not the best one out there. It was developed back during SL 2003 and may or may not function well now...
vector alignment;
vector targetVector;
integer travelDistance;
integer numListen;
integer targetFloor = -1;
list floorHeights = [26.1,36,46,56,66,76,86,96,106,116,126,136];
float fixedFloorHeight = 10; //Set to floor heights, or set to -1 to use floorHeights list
float speed = 0.25; //Valid values are 0.01 to 1.0, a Percentage of maxSpeed;
float maxSpeed = 32;
float precision = 0.5;
integer autoSpeed = TRUE;
integer initialDistance;
integer commChannel = 6538559;
integer numListenPrivate;
integer TTL = 5;
float lastCommand;
elevate (vector end)
{
vector current = llGetPos();
travelDistance = llRound(current.z-end.z);
travelDistance = llAbs(travelDistance);
if (autoSpeed)
{
if (travelDistance < (initialDistance / 2))
{
speed -= (precision * 2 / 50);
if (speed < 0.25)
speed = 0.25;
}
else
{
speed += (precision / 25);
if (speed > 1)
speed = 1;
}
}
if (travelDistance > 30)
{
travelDistance = 30;
if (end.z > current.z)
{
end.z = current.z + 30;
}
else
{
end.z = current.z - 30;
}
}
float i = travelDistance/(maxSpeed*speed);
llMoveToTarget(end,i);
}
GotoFloor (integer floor, key id)
{
if (targetFloor != floor)
{
llSetStatus(STATUS_PHYSICS, TRUE);
llLoopSound("ElevatorNoises", 1);
targetFloor = floor;
if (fixedFloorHeight > 0)
{
targetVector = alignment;
targetVector.z = alignment.z + (fixedFloorHeight * floor);
}
else
{
targetVector = alignment;
targetVector.z = llList2Float(floorHeights, floor);
}
vector current = llGetPos();
initialDistance = llRound(current.z-targetVector.z);
initialDistance = llAbs(initialDistance);
if (autoSpeed)
{
speed = 0.01;
}
llSay(0, "Heading for Floor # " + (string)targetFloor + "[" + (string)targetVector.z + "]");
elevate(targetVector);
llSetTimerEvent(precision);
}
}
reset()
{
llSay(0, "Resetting Elevator...");
llSetStatus(STATUS_ROTATE_X| STATUS_ROTATE_Y| STATUS_ROTATE_Z, FALSE);
alignment = llGetPos();
llSetStatus(STATUS_PHYSICS, FALSE);
llStopSound();
lastCommand = llGetTimeOfDay();
llListenRemove(numListen);
numListen = llListen( 0, "", NULL_KEY, "");
}
default
{
state_entry()
{
reset();
}
on_rez(integer start_param)
{
reset();
if (start_param > 0)
{
commChannel = start_param;
llListenRemove(numListenPrivate);
numListenPrivate = llListen(commChannel, "", NULL_KEY, "");
}
}
listen(integer a, string n, key id, string m)
{
vector pos;
integer Floor;
float tempFloat;
list tempList;
float timeStamp;
integer index;
string command;
string data;
float timediff;
timediff = (llGetTimeOfDay() - lastCommand);
if ((a == commChannel)&&(timediff > TTL))
{
lastCommand = llGetTimeOfDay();
//Separate out incoming data
tempList = llCSV2List(m);
timeStamp = llList2Float(tempList, 0);
index = llList2Integer(tempList, 1);
command = llList2String(tempList, 2);
data = llList2String(tempList, 3);
//If public command then extract message
if ((index == -2) && (command == "pub"))
{
m = data;
}
}
if (llSubStringIndex(m, "goto floor") == 0)
{
Floor = (integer)llGetSubString(m, 10, llStringLength(m));
GotoFloor(Floor, NULL_KEY);
}
if (llSubStringIndex(m, "speed") == 0)
{
tempFloat = (float)llGetSubString(m, 5, llStringLength(m));
if ((tempFloat > 0.001) && (tempFloat <= 1.0))
{
speed = tempFloat;
}
}
if ((m=="elevator reset") && (id==llGetOwner()))
{
reset();
}
}
timer()
{
vector CurrentPos;
float tempfloat;
CurrentPos = llGetPos();
tempfloat = (CurrentPos.z - targetVector.z);
if (llFabs(tempfloat) < 2)
{
if (llFabs(tempfloat) < 0.05)
{
//Arrived at Floor
llWhisper(0, "Arrived at floor #" + (string)targetFloor);
llSetTimerEvent(0);
llSetStatus(STATUS_PHYSICS, FALSE);
llStopSound();
}
else
{
llMoveToTarget(targetVector,1.0);
}
}
else
{
if (fixedFloorHeight > 0)
{
targetVector = alignment;
targetVector.z = alignment.z + (fixedFloorHeight * targetFloor);
}
else
{
targetVector = alignment;
targetVector.z = llList2Float(floorHeights, targetFloor);
}
elevate(targetVector);
}
}
}