OSSL Script Library/OSSL Poseball

From OpenSimulator

Jump to: navigation, search

A poseball script, using OSSL functions

The code contains a lot of comments, explaining what does what, and why it is there.

// OSSL Poseball
// By Fritigern Gothly
// Written on March 18th, 2012
// Additional contributors:
// <add your name here if you made any improvements to this script>
 
vector target = <0.0, 0.0, 1.0>; // Change these values to position your avatar.
 
// =============================
// DO NOT CHANGE BELOW THIS LINE
// =============================
string anim; // Will be used for the animation name.
integer used; // Used as a flag to determine what the script should do.
key user; // This will hold the key of the user that uses the poseball
 
default
{
    state_entry()
    {
        llSitTarget(target, ZERO_ROTATION);
        anim = llGetInventoryName(INVENTORY_ANIMATION,0); // Get the first animation in the prim's inventory.
        if(anim == "") // If no animation was found...
        {
            state error; // Go and wait until the inventory has changed.
        } else { // Otherwise....
            llOwnerSay("Found animation ''"+anim+"''"); // Confirm that there is an animation in the inventory
        }
    }
 
    changed(integer change)
    {
        if (change & CHANGED_LINK) // Triggered when someone sits on the4 poseball. When you sit, you really link to the ball.
        {
            if(!used)
            {
                used = TRUE;
                user = llAvatarOnSitTarget();
                if(user == NULL_KEY) used = FALSE; // Make sure that there's really someone sitting on the poseball
                llSetAlpha(0.0,ALL_SIDES); // Hide the poseball when sat upon
                osAvatarStopAnimation(user, "sit"); // Stop the default sit animation (IMPORTANT!)
                osAvatarPlayAnimation(user, anim);  // And start the animation that we want started.
            } else {
                used = FALSE;
                llSetAlpha(1.0,ALL_SIDES); // Make the poseball visible again when user stands up
                osAvatarStopAnimation(user, anim); //Stop the animation when the user stands up.
                user = NULL_KEY; // Probably redundant, but we want to make sure that the value for ''user'' is empty.
            }
        }
 
        if(change & CHANGED_INVENTORY)
        {
            llResetScript(); // Reset the script if the inventopry has changed.
        }
    }
}
 
state error
{
    state_entry()
    {
        llOwnerSay("This poseball contains no animations. Please add one.");
    }
 
    changed(integer change)
    {
        if(change & CHANGED_INVENTORY)
        {
            llOwnerSay("Change detected. Initializing");
            llResetScript();
        }
    }
}

OSSL Multi Gender Poseball

vector target = <0.0, 0.0, 1.0>; // Change these values to adjust your avatar's position.
list male_animations; // List for male animations
list female_animations; // List for female animations
list unknown_animations; // List for third gender animations
integer used; // Used as a flag to determine what the script should do.
key user; // Stores the key of the user using the pose ball
string chosen_anim; // Stores the chosen animation
 
default
{
    state_entry()
    {
        llSitTarget(target, ZERO_ROTATION);
 
        // Collect animations in inventory
        integer num_anims = llGetInventoryNumber(INVENTORY_ANIMATION);
        integer i;
        for (i = 0; i < num_anims; ++i) {
            string anim_name = llGetInventoryName(INVENTORY_ANIMATION, i);
            if (llSubStringIndex(anim_name, "male_") == 0) {
                male_animations += anim_name;
            } else if (llSubStringIndex(anim_name, "female_") == 0) {
                female_animations += anim_name;
            } else if (llSubStringIndex(anim_name, "unknown_") == 0) {
                unknown_animations += anim_name;
            }
        }
 
        if (male_animations == [] && female_animations == [] && unknown_animations == []) {
            state error; // Go and wait until inventory changes.
        } else { // Otherwise...
            llOwnerSay("Found animations: Male: " + (string)llGetListLength(male_animations) + ", Female: " + (string)llGetListLength(female_animations) + ", Unknown: " + (string)llGetListLength(unknown_animations)); // Confirm that there are animations in inventory
        }
    }
 
    changed(integer change)
    {
        if (change & CHANGED_LINK) // Triggered when someone sits on the pose ball. When you sit down, you actually link with the ball.
        {
            if(!used)
            {
                used = TRUE;
                user = llAvatarOnSitTarget();
                if(user == NULL_KEY) used = FALSE; // Make sure someone is actually sitting on the pose ball
                llSetAlpha(0.0,ALL_SIDES); // Hide the pose ball when someone sits on it
                osAvatarStopAnimation(user, "sit"); // Stop the default sitting animation (IMPORTANT!)
 
                // Get user's gender
                string gender = osGetGender(user);
 
                // Select and play a random animation
                if (gender == "male") {
                    chosen_anim = llList2String(male_animations, llFloor(llFrand(llGetListLength(male_animations))));
                } else if (gender == "female") {
                    chosen_anim = llList2String(female_animations, llFloor(llFrand(llGetListLength(female_animations))));
                } else {
                    chosen_anim = llList2String(unknown_animations, llFloor(llFrand(llGetListLength(unknown_animations))));
                }
                osAvatarPlayAnimation(user, chosen_anim);  // And start the chosen animation.
                state running; // Switch to the "running" state to monitor the animation playback
            } else {
                used = FALSE;
                llSetAlpha(1.0,ALL_SIDES); // Make the pose ball visible again when the user stands up
                osAvatarStopAnimation(user, chosen_anim); // Stop the animation when the user stands up.
                user = NULL_KEY; // Probably redundant, but we want to ensure the value for ''user'' is empty.
            }
        }
 
        if(change & CHANGED_INVENTORY)
        {
            llResetScript(); // Reset the script if inventory changes.
        }
    }
}
 
state running
{
    state_entry()
    {
        // Additional actions can be performed here when the animation is playing
    }
 
    on_rez(integer start_param)
    {
        llResetScript();
    }
 
    changed(integer change)
    {
        if(change & CHANGED_LINK)
        {
            used = FALSE;
            llSetAlpha(1.0,ALL_SIDES); // Make the pose ball visible again when the user stands up
            osAvatarStopAnimation(user, chosen_anim); // Stop the animation when the user stands up.
            user = NULL_KEY; // Probably redundant, but we want to ensure the value for ''user'' is empty.
            llSleep(0.1);
            state default;
        }
    }
}
 
state error
{
    state_entry()
    {
        llOwnerSay("This pose ball contains no animations. Please add one.");
    }
 
    changed(integer change)
    {
        if(change & CHANGED_INVENTORY)
        {
            llOwnerSay("Change detected. Initializing.");
            llResetScript();
        }
    }
}
Personal tools
General
About This Wiki