Jump to content

Robby Falworth

Resident
  • Posts

    6
  • Joined

  • Last visited

Posts posted by Robby Falworth

  1.  

    Hello everyone,

    I have 2 questions

    My first :

    Here is the script for opening and closing a door. However, the sound of the opening starts when you click and the closing sound once the door is closed. I would like the closing sound to start during the closing movement and not once closed.

    My second :

    Do you think I can add a script in a second prim linked so that the two objects follow the same movement?

    Can you help me please ?

    /*
     * Smooth Rotating Linked Door With Hinge
     *
     * By: Lyn Mimistrobell
     * Version: 1.1
     * License: Do whatever you like with it, just don't blame me if you break it :)
     */
     
    /*
     * Define the rotation in degrees, using the door prim's local coordinate
     * system
     */
    vector      ROTATION            = <0.0, 0.0, 180.0>;
     
    /*
     * Define the position of the virtual hinge; usually this is half the door
     * prim's width and thickness
     */
    vector      HINGE_POSITION      = <-0.4, 1.3, 0.0>;
     
    /*
     * Define how fast the door opens, in seconds
     */
    float       SECONDS_TO_ROTATE   = 1.0;
     
    /*
     * Define after how much time the door should close automatically, in seconds;
     * set to 0.0 to disable autolmatic closing
     */
    float       AUTO_CLOSE_TIME     = 10.0;
     
    /*
     * Define a sound that plays when the door starts to open; set to NULL_KEY
     * for no sound.
     */
    key         SOUND_ON_OPEN       = "b814a289-a786-ef81-e5df-e0e9b9aeebab";
     
    /*
     * Define a sound that plays when the door has closed; set to NULL_KEY
     * for no sound.
     */
    key         SOUND_ON_CLOSE      = "00429879-654d-7925-9e66-5c1695324e58";
     
    /*
     * Define the volume of the opening and closing sounds
     */
    float       SOUND_VOLUME        = 1.0;
     
    /*
     * NORMALLY, THERE IS NO NEED TO CHANGE ANYTHING BELOW THIS COMMENT. IF YOU DO
     * YOU RISK BREAKING IT.
     */
     
    integer     gClosed;            // Door state: TRUE = closed, FALSE = opened
    rotation    gRotationClosed;    // Initial rotation of the door (closed)
    vector      gPositionClosed;    // Initial position of the door (closed)
    vector      gRotationPerSecond; // The amount to rotate each second
     
    doOpenOrClose() {
        /*
         * Only perform the rotation if the door isn't root or unlinked
         */
        integer linkNumber = llGetLinkNumber();
        if (linkNumber < 2)
            return;
     
        if (gClosed) {
            /*
             * Store the initial rotation and position so we can return to it.
             *
             * Rotating back purely by calculations can in the longer term cause the door
             * to be positioned incorrectly because of precision errors
             *
             * We determine this everytime before the door is being opened in case it was
             * moved, assuming the door was closed whilst being manipulated.
             */
            gPositionClosed = llGetLocalPos();
            gRotationClosed = llGetLocalRot();
     
            /*
             * Play the opening sound and preload the closing sound
             */
            if (SOUND_ON_OPEN)
                llPlaySound(SOUND_ON_OPEN, SOUND_VOLUME);
        }
     
        vector hingePosition = gPositionClosed + HINGE_POSITION * gRotationClosed;
     
        /*
         * Reset the timer and start moving
         */
        llResetTime();
        while (llGetTime() < SECONDS_TO_ROTATE) {
            float time = llGetTime();
            if (! gClosed)
                /*
                 * Invert the timer for closing direction
                 */
                time = SECONDS_TO_ROTATE - time;
     
            rotation rotationThisStep = llEuler2Rot(gRotationPerSecond * time) * gRotationClosed;
            vector positionThisStep = hingePosition - HINGE_POSITION * rotationThisStep;
            llSetLinkPrimitiveParamsFast(linkNumber, [PRIM_ROT_LOCAL, rotationThisStep, PRIM_POS_LOCAL, positionThisStep]);
        }
     
        /*
         * Set the new state
         */
        gClosed = !gClosed;
     
        if (gClosed) {
            /*
             * Finalize the closing movement
             */
            llSetLinkPrimitiveParamsFast(linkNumber, [PRIM_ROT_LOCAL, gRotationClosed, PRIM_POS_LOCAL, gPositionClosed]);
     
            /*
             * Play the closing sound and preload the opening sound
             */
           if (SOUND_ON_CLOSE)
                llPlaySound(SOUND_ON_CLOSE, SOUND_VOLUME);
            if (SOUND_ON_OPEN)
                llPreloadSound(SOUND_ON_OPEN);
        } else {
            /*
             * Finalize the opening movement
             */
            rotation rotationOpened = llEuler2Rot(ROTATION * DEG_TO_RAD) * gRotationClosed;
            vector positionOpened = hingePosition - HINGE_POSITION * rotationOpened;
            llSetLinkPrimitiveParamsFast(linkNumber, [PRIM_ROT_LOCAL, rotationOpened, PRIM_POS_LOCAL, positionOpened]);
     
            /*
             * Preload the closing sound
             */
            if (SOUND_ON_CLOSE)
                llPreloadSound(SOUND_ON_CLOSE);
     
            /*
             * Set a timer to automatically close
             */
            llSetTimerEvent(AUTO_CLOSE_TIME);
        }
    }
     
    default {
        state_entry() {
            /*
             * Assume the door is closed when the script is reset
             */
            gClosed = TRUE;
     
            /*
             * These doesn't change unless the script is changed, calculate them once
             */
            gRotationPerSecond = (ROTATION * DEG_TO_RAD / SECONDS_TO_ROTATE);
     
            /*
             * Preload the opening sound
             */
            if (SOUND_ON_OPEN)
                llPreloadSound(SOUND_ON_OPEN);
            
        }
        touch_start(integer agentCount) {
            doOpenOrClose();
        }
        timer() {
            llSetTimerEvent(0.0);
     
            /*
             * Close the door if it isn't already closed
             */
            if (! gClosed)
                doOpenOrClose();
        }
    }

     

×
×
  • Create New...