llStopAnimation(string anim)
Stops the animation anim. In order for this to work, the script must have the PERMISSION_TRIGGER_ANIMATION
permission on an avatar. See llRequestPermissions and llGetPermissions for more information on permissions.
Like llStartAnimation, anim must be in the prim’s inventory. Except for built-in animations and unlike llStartAnimation, llStopAnimation can also stop an animation by key.
It is usually good practice to check llGetPermissions before calling this function. Otherwise this message might appear:
“Script trying to stop animations but PERMISSION_TRIGGER_ANIMATION permission not set”.
Note: while the official docs and editor help tool tip claim: “This function stops animation anim for the avatar that owns the object.”, that is incorrect; as long as permissions have been granted, any avatar’s animations can be stopped using llStopAnimation.
See animation for a current list of animation names.
The script below shows an example of this function’s use (it is the freely-distributed animation script many people use).
// Animation Script v1.2.1 // Written by Xylor Baysklef /////////////// CONSTANTS /////////////////// list ANIMATIONS = [ "aim_L_bow", "aim_R_bazooka", "aim_R_handgun", "aim_R_rifle", "angry_fingerwag", "angry_tantrum", "away", "backflip", "blowkiss", "bow", "brush", "clap", "courtbow", "cross_arms", "crouch", "crouchwalk", "curtsy", "dance1", "dance2", "dance3", "dance4", "dance5", "dance6", "dance7", "dance8", "dead", "drink", "express_afraid", "express_anger", "express_bored", "express_cry", "express_embarrased", "express_laugh", "express_repulsed", "express_sad", "express_shrug", "express_surprise", "express_wink", "express_worry", "falldown", "female_walk", "fist_pump", "fly", "flyslow", "hello", "hold_R_bow", "hold_R_bazooka", "hold_R_handgun", "hold_R_rifle", "hold_throw_R", "hover", "hover_down", "hover_up", "impatient", "jump", "jumpforjoy", "kick_roundhouse_R", "kissmybutt", "kneel_left", "kneel_right", "land", "laugh_short", "motorcycle_sit", "musclebeach", "no_head", "no_unhappy", "nyanya", "peace", "point_me", "point_you" ]; list ANIMATIONS2 = [ "prejump", "punch_L", "punch_onetwo", "punch_R", "RPS_countdown", "RPS_paper", "RPS_rock", "RPS_scissors", "run", "salute", "shoot_L_bow", "shout", "sit", "sit_female", "sit_ground", "sit_to_stand", "sleep", "slowwalk", "smoke_idle", "smoke_inhale", "smoke_throw_down", "snapshot", "soft_land", "stand", "standup", "stand_1", "stand_2", "stand_3", "stand_4", "stretch", "stride", "surf", "sword_strike_R", "talk", "throw_R", "tryon_shirt", "turnback_180", "turnleft", "turnright", "turn_180", "type", "uphillwalk", "walk", "whisper", "whistle", "wink_hollywood", "yell", "yes_happy", "yes_head", "yoga_float" ]; ///////////// END CONSTANTS ///////////////// ///////////// GLOBAL VARIABLES /////////////// //integer gToggle = 0; integer gAnimNumber; integer gTotalAnims; string gAnimName = "type"; /////////// END GLOBAL VARIABLES ///////////// default { state_entry() { //llSay(0, "Init..."); llRequestPermissions(llGetOwner(), PERMISSION_TRIGGER_ANIMATION); ANIMATIONS += ANIMATIONS2; ANIMATIONS2 = []; gTotalAnims = llGetListLength(ANIMATIONS); gAnimNumber = -1; llListen(0, "", llGetOwner(), ""); } on_rez(integer param) { //llGiveInventory(llGetOwner(), "Animation Names"); llResetScript(); } listen(integer channel, string name, key id, string mesg) { string preamble = llGetSubString(mesg, 0, 3); if (preamble != "anim" && preamble != "stop") return; integer perm = llGetPermissions(); if ( !(perm & PERMISSION_TRIGGER_ANIMATION)) { llRequestPermissions(llGetOwner(), PERMISSION_TRIGGER_ANIMATION); return; } list parsed = llParseString2List(mesg, [ " " ], []); //llSay(0, (string)parsed); string anim = llList2String(parsed, 1); if (preamble == "stop") { //llSay(0, "Stopping: " + llGetAnimation(llGetOwner())); //llStopAnimation(llGetAnimation(llGetOwner())); if (anim == "") anim = gAnimName; if (anim == "all") { integer i; llSay(0, "Stopping all animations... please wait."); for (i=0; i<gTotalAnims; i++) llStopAnimation(llList2String(ANIMATIONS, i)); llSay(0, "Done."); return; } //llSay(0, "Stopping: " + anim); llStopAnimation(anim); return; } gAnimName = anim; //llSay(0, "Animation: " + gAnimName); llStartAnimation(gAnimName); } run_time_permissions(integer perm) { //llStopAnimation(gAnimName); //gToggle = 0; } attach(key id) { integer perm = llGetPermissions(); if (id != NULL_KEY) { if (! (perm & PERMISSION_TRIGGER_ANIMATION)) { llRequestPermissions(llGetOwner(), PERMISSION_TRIGGER_ANIMATION); } } else { if (perm & PERMISSION_TRIGGER_ANIMATION) { llStopAnimation(gAnimName); } } } touch_start(integer total_number) { if (llDetectedKey(0) != llGetOwner()) return; integer perm = llGetPermissions(); if (perm & PERMISSION_TRIGGER_ANIMATION) { if (gAnimNumber != -1) { llStopAnimation( llList2String(ANIMATIONS, gAnimNumber) ); } gAnimNumber++; if (gAnimNumber == gTotalAnims) gAnimNumber = 0; gAnimName = llList2String(ANIMATIONS, gAnimNumber); llStartAnimation( gAnimName ); llSay(0, "Animation: " + gAnimName); } else { llRequestPermissions(llGetOwner(), PERMISSION_TRIGGER_ANIMATION); } } }
To start an animation, use llStartAnimation.
Q: Can llStopAnimation accept a key to an animation to stop an animation? (See llGetAnimationList.)
A: Yes, even though llStartAnimation does not accept keys.