OSSL Script Library/OSSL Poseball
From OpenSimulator
(Difference between revisions)
m (Heh, forgot to set alpha on the poseball. :-)))) |
|||
Line 72: | Line 72: | ||
{ | { | ||
llOwnerSay("Change detected. Initializing"); | llOwnerSay("Change detected. Initializing"); | ||
+ | llResetScript(); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | OSSL Multi Gender Poseball | ||
+ | |||
+ | <source lang="lsl"> | ||
+ | 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(); | llResetScript(); | ||
} | } |
Latest revision as of 03:26, 5 March 2024
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(); } } }