llStartAnimation(string anim);

Triggers 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.

Built-in animations always work, but if anim is a custom animation, it must be contained in the inventory of the scripted prim.

It is usually good practice to check llGetPermissions before calling this function. The fact that this is not usually done is the reason so many “Script trying to trigger animations but PERMISSION_TRIGGER_ANIMATION permission not set” messages happen, which can be annoying (especially if they keep trying over and over).

An animation which doesn’t end on its own can be stopped with llStopAnimation.

To animate someone sitting on an object, it’s a good idea to stop the generic sit animation first (llStopAnimation("sit")) unless the new animation has a higher priority than the default sit.

  • Note that although the PERMISSION_TRIGGER_ANIMATION permission is automatically granted when sitting, a prior call to llRequestPermissions is required — see sample scripts.
  • Note also (as mentioned in llSitTarget) that exact visual avatar placement for a given coordinate set is in fact rather uncertain, especially with custom animations. It will vary depending on chosen animation, and more critically between different avatars due to their size, shape, and even gender (sometimes very large offsets).

See animation for a current list of built-in standard animation names.

Here’s 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);
        ANIMATIONS2 = [];
        gTotalAnims = llGetListLength(ANIMATIONS);
        gAnimNumber = -1;
        llListen(0, "", llGetOwner(), "");
    on_rez(integer param) {
        //llGiveInventory(llGetOwner(), "Animation Names");
    listen(integer channel, string name, key id, string mesg) {
        string preamble = llGetSubString(mesg, 0, 3);
        if (preamble != "anim" && preamble != "stop")
        integer perm = llGetPermissions();
        if ( !(perm & PERMISSION_TRIGGER_ANIMATION)) {            
            llRequestPermissions(llGetOwner(), PERMISSION_TRIGGER_ANIMATION);
        list parsed = llParseString2List(mesg, [ " " ], []);
        //llSay(0, (string)parsed);
        string anim = llList2String(parsed, 1);
        if (preamble == "stop") {
            //llSay(0, "Stopping: " + 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.");
            //llSay(0, "Stopping: " + anim);
        gAnimName = anim;
        //llSay(0, "Animation: " + gAnimName);
    run_time_permissions(integer perm) {
        //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) {

    touch_start(integer total_number) {
        if (llDetectedKey(0) != llGetOwner())
        integer perm = llGetPermissions();
            if (gAnimNumber != -1) {
                llStopAnimation( llList2String(ANIMATIONS, gAnimNumber) );
            if (gAnimNumber == gTotalAnims)
                gAnimNumber = 0;
            gAnimName = llList2String(ANIMATIONS, gAnimNumber);
            llStartAnimation( gAnimName );
            llSay(0, "Animation: " + gAnimName);
        else {
            llRequestPermissions(llGetOwner(), PERMISSION_TRIGGER_ANIMATION);

Compare with llStopAnimation.

Note: while the official documentation claims “This function starts animation anim for the avatar that owns the object.”, this is incorrect; as long as permissions have been granted, any avatar can be animated using llStartAnimation — chairs, pose balls, whatever. (Another example: driver and passenger seat on vehicle can usually seat anyone — sit animation — even though driving is normally restricted to owner.)

Q: Is there a way to load an animation from a key?
A: No.