OSSL Script Library/OSSL Poseball
From OpenSimulator
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(); } } }