All pastes #810653 Raw Edit

Anonymous

public text v1 · immutable
·published 2007-12-10 03:41 UTC
rendered paste body
// Basic Door Script
// Original Script By Unknown
// Modifications made by Zanlew Wu 01-Apr-2003
//

//============================================
// Declare global constants.
//
integer SW_OPEN = FALSE;   // used to signify door swinging open
integer SW_CLOSE = TRUE;   // used to signify door swinging closed
integer SW_NORMAL = FALSE; // used to signify a normal swing
integer SW_REVERSE = TRUE; // used to signify a reverse swing
//
// Note that it is hard to call a given swing outward or inward as that has
// a lot to do witht he rotation and/or orientation of the door, which
// swing direction is correct/desired, and whether you are referring to the
// swing from the "out" side of the door or the "in" side of the door. It
// was easier by convention to call the swings normal and reverse.

//============================================
// Declare global fields.
//
key     gfOwnerKey;    // Owner of the elevator object
integer gfDoorClosed;  // Current state of the door (Open, Closed)
integer gfDoorSwing;   // Deteremines which way the door swings (In, Out)

//============================================
// gmInitFields
//
gmInitFields()
{
    //
    // Get the owner of the door.
    //
    gfOwnerKey = llGetOwner();
    
    //
    // Close doors by default.
    //
    gfDoorClosed = TRUE;
    
    //
    // Set the door swing.
    //
    gfDoorSwing = SW_NORMAL;
    
    return;
}
//
// End of gmInitVars
//============================================

//============================================
// gmSwingDoor
//
gmSwingDoor(integer direction)
{
    //-----------------------
    // Local variable defines
    //
    rotation rot;
    rotation delta;
    float piVal;
    
    //
    // First thing we need to do is decide whether we are applying a 
    // negative or positive PI value to the door swing algorythm. The
    // positive or negative makes the difference on which direction the door
    // swings. Additionally, since we allow the doors to modify their swing
    // direction (so the same door can be placed for inward or outward
    // swing, we have to take that into account as well. Best to determine
    // that value first. The rest of the formula does not change regardless
    // of door swing direction.
    //
    // So we have two variables to pay attention to: open/close and swing
    // in/out. First we start with open/close. We will presume the
    // following:
    //      SW_OPEN:  +PI
    //      SW_CLOSE: -PI
    // This also presumes that the door has a standard swing value of 
    // SW_NORMAL.
    //
    // A door that has had it's swing changed would have those values
    // reversed:
    //      SW_OPEN:  -PI
    //      SW_CLOSE: +PI
    //
    // The variable passed into this method determines if the intent were
    // to open the door or close it.
    //
    // The global field gfDoorSwing will be used to modify the PI based on
    // whether the door normally swings in or out.
    //
    if (direction == SW_OPEN)
    {
        //
        // Ok, we know the door is opening. Assign a +PI value to piVal.
        //
        piVal = PI/4;
        //
        // Now check to see if the door has it's swing reversed.
        //
        if (gfDoorSwing == SW_REVERSE)
        {
            //
            // Yep, it's reversed and we are opening the door, so replace 
            // piVal with a -PI value.
            //
            piVal = -PI/4;
        }
    } else
    {
        //
        // So we know we are closing the door this time. Assign a -PI value
        // to piVal.
        //
        piVal = -PI/4;
        //
        // Now check to see if the door has it's swing reversed.
        //
        if (gfDoorSwing == SW_REVERSE)
        {
            //
            // Yep, it's reversed and we are closing the door, so we need to
            // assing a +PI value to piVal.
            //
            piVal = PI/4;
        }
    }
    
    //
    // This formula was part of the original script and is what makes
    // the door swing open and closed. This formula use a Pi/-Pi to 
    // move the door one quarter-circle in total distance.
    //
    // The only change I've made to this function is to replace the hard-
    // coded PI/-PI values with a variable that is adjusted
    // programmatically to suit the operation at hand. 
    //
    rot = llGetRot();
    delta = llEuler2Rot(<0,0,piVal> );
    rot = delta * rot;
    llSetRot(rot);
    llSleep(0.25); 
    rot = delta * rot;
    llSetRot(rot);
    
    return;
}
//
// End of gmSwingDoor
//============================================

//============================================
// gmCloseDoor
//
// The close command is used to close doors. If the doors are 
// locked, the doors cannot be closed. (Note: presumably, this 
// script does not allow doors to be opened AND locked at the same 
// time). If the doors are already closed, they cannot be 
// re-closed. These checks will be made before performing a door 
// close operation. Once the door is successfully closed, the 
// door's state will be updated.
//
gmCloseDoor()
{
    //
    // First let's check to see if the door is already closed. If it 
    // is, let the user know.
    //
    if (gfDoorClosed == TRUE)  
    {
        //
        // Yep, it was already closed.
        //
        llSay (0, "This door is already closed.");
        return;
    }
        
    //
    // Now we generate the proper sound for the door closing.
    //
    llTriggerSound("Door close", 0.2);

    //
    // Now we call the method gmSwingDoor with the SW_CLOSE argument (since
    // we are closing the door.
    //    
    gmSwingDoor(SW_CLOSE);    

    //
    // Now that the door is closed, set the door's state.
    //
    gfDoorClosed = TRUE;

    return;
}
//
// End of gmCloseDoor
//============================================

//============================================
// gmOpenDoor
//
// The open command is used to open the doors. If the doors are 
// locked, the doors cannot be opened. If the doors are already 
// opened, they cannot be re-opened. These checks will be made 
// before performing a door open operation. Once the door is 
// successfully opened, the door's state will be updated.
//
gmOpenDoor()
{
    //
    // First let's check to see if the door is open already. If it is,
    // let the user know.
    //
    if (gfDoorClosed == FALSE)  
    {
        //
        // Yep, it was already open.
        //
        llSay (0, "This door is already open.");
        return;
    }
    
    //
    // Now we generate the proper sound for the door closing.
    //
    llTriggerSound("Door open", 0.2);
    
    //
    // Now we call the method gmSwingDoor with the SW_OPEN argument (since
    // we are opening the door.
    //    
    gmSwingDoor(SW_OPEN);

    //
    // Now that the door is opened, set the door's state.
    //
    gfDoorClosed = FALSE;
    return;
}
//
// End of gmOpenDoor
//============================================


//============================================
// Default State
//
// This is the state that is automatically bootstrapped when the object
// is first created/rez'd, or the world or environment resets.
// 
default
{
    //
    // state_entry() is the first method executed when the state it resides
    // in is run. So State A, B, and C all can have state_entry methods,
    // and if they do, they are run when their respective states are called
    // and or executed.
    //
    state_entry()
    {
        //
        // Perform global field initialization
        //
        gmInitFields();
        
        //
        // We are listening for two different commands. This script is set 
        // up to accept spoken commands only from the object owner.
        //
        llListen(0, "", "", "open");
        llListen(0, "", "", "close");
    }
    
    listen(integer channel, string name, key id, string msg)
    {
        //-----------------------
        // Local variable defines
        //
        string operName;
        string ownerName;

        //
        // Ideally, we want the door only to work on spoken commands 
        // from the owner. To accomplish this task, we need to check the 
        // id of the owner and the person issuing the command to see if 
        // they match.
        //
        // Alternately, commands can be issued from the control panel, 
        // which can be used by anyone. Later on, it will be presumed that
        // access to the control panel will be controlled.
        //
        
        //
        // First get the string names of the owner and the operator so they
        // can be compared.
        //
        operName = llKey2Name(id);
        ownerName = llKey2Name(gfOwnerKey);
        
        //
        // First we check the owner.
        //
        if (ownerName != operName)
        {
            //
            // Nope, not a match. 
            //
            llTriggerSound("Door knock", 0.2);
            llSay(0, "Voice command access is for owner only.");
            return;
        }
            
        //----------------------------------------
        // OPEN DOOR
        //
        if(msg == "open") 
        { 
            gmOpenDoor();
        }
        
        //----------------------------------------
        // CLOSE DOOR
        //
        if (msg == "close")
        {
            gmCloseDoor();
        }
    }
    
    touch_start(integer i)
    {
        //
        // This is the same code as the UNLOCK, OPEN and CLOSE DOOR 
        // code. For reasons of brevity, I have removed the comments 
        // from this copy of the code.
        //
        if (gfDoorClosed == FALSE)
        {
            llTriggerSound("Door close", 0.2);
            gmSwingDoor(SW_CLOSE);
            gfDoorClosed = TRUE;
            return;
        } else
        {
            llTriggerSound("Door open", 0.2);
            gmSwingDoor(SW_OPEN);
            gfDoorClosed = FALSE;
            return;
        }
    }
}