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.