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(); } } }