アバターの状態を監視して、アニメーションを変更するスクリのサンプル

アバターの状態でアニメーションを変更するスクリのサンプルです。
Timer でアバターの状態を取得して、状態によってアニメを切り替えます。
サンプルは２つのアニメを切り替えるだけですが
以下の状態わけで再生するアニメーションを変更できますので
string anim_* を追加してゆけばそれぞれ別のアニメを再生することが可能です。

ではみなさんお楽しんでね！！

<font color="Gray">*AOの実装には向きません[^1]*</font>

| ステータス | 説明 |
|---|---|
|AGENT_ALWAYS_RUN|走行モード("常に走る") になっている、もしくは tap-tap-hold を使っている|
|AGENT_ATTACHMENTS|装着している|
|AGENT_AUTOPILOT|"オートパイロット" モード |
|AGENT_AWAY|"away" モード |
|AGENT_BUSY|"busy" モード |
|AGENT_CROUCHING|しゃがんでいる |
|AGENT_FLYING|飛んでいる |
|AGENT_IN_AIR|空中に浮かんでいる |
|AGENT_MOUSELOOK|マウスルック |
|AGENT_ON_OBJECT|オブジェクトに座っている |
|AGENT_SCRIPTED|スクリプトを装着 |
|AGENT_SITTING|座っている |
|AGENT_TYPING|入力している |
|AGENT_WALKING|歩いている、走っている、しゃがみ歩きをしている |



```[status_anim_change.lsl]

string anim_1 = "patapata";
string anim_2 = "patapata 1";
float gap = 0.5;
string currentAnim = "";

startAnimation(string anim)
{
    if(currentAnim == anim) return;
    
    stopAnimation();
    
    currentAnim = anim;
    
    if( currentAnim != "")
    {
        llStartAnimation(currentAnim);
    }
}

stopAnimation()
{
    if(currentAnim != "")
    {
        llStopAnimation(currentAnim);
        currentAnim = "";
    }
}

default
{
    state_entry()
    {
        llRequestPermissions(llGetOwner(),PERMISSION_TRIGGER_ANIMATION);
        //channel = genCh();
        //handle = llListen(channel, "", llGetOwner(), "");
    }

    changed(integer change)
    {
        if(change & CHANGED_OWNER)
        {
            llResetScript();
        }
    }
    
    attach(key id)
    {
        if(id)
        {
            llRequestPermissions(llGetOwner(),PERMISSION_TRIGGER_ANIMATION);
        }
        else
        {
            currentAnim = "";
        }
    }
    
    run_time_permissions(integer perm)
    {
        if (perm & PERMISSION_TRIGGER_ANIMATION)
        {
            llStopAnimation("sit");
            startAnimation(anim_1);
            llSetTimerEvent(gap);
        }
    }
    timer()
    {
        /*
        AGENT_ALWAYS_RUN    // 走行モード("常に走る") になっている、もしくは tap-tap-hold を使っている 
        AGENT_ATTACHMENTS   // 装着している 
        AGENT_AUTOPILOT     // is in "オートパイロット" モード 
        AGENT_AWAY          // "away" モード 
        AGENT_BUSY          // "busy" モード 
        AGENT_CROUCHING     // しゃがんでいる 
        AGENT_FLYING        // 飛んでいる 
        AGENT_IN_AIR        // 空中に浮かんでいる 
        AGENT_MOUSELOOK     // マウスルック 
        AGENT_ON_OBJECT     // オブジェクトに座っている 
        AGENT_SCRIPTED      // スクリプトを装着 
        AGENT_SITTING       // 座っている 
        AGENT_TYPING        // 入力している 
        AGENT_WALKING       // 歩いている、走っている、しゃがみ歩きをしている 
        */
        
        integer info = llGetAgentInfo(llGetOwner());

        if( info & AGENT_FLYING )
        {
            startAnimation(anim_1);
        }
        else if( info & AGENT_IN_AIR )
        {
            startAnimation(anim_1);
        }
        else if( info & AGENT_TYPING )
        {
            startAnimation(anim_2);
        }
        else if( info & AGENT_WALKING )
        {
            startAnimation(anim_1);
        }
        else if( info & AGENT_ATTACHMENTS )
        {
            startAnimation(anim_1);
        }
        else
        {
            stopAnimation();
        }
    }
}
```

[^1]: AO には 本来 llSetAnimationOverride を使うべきです。そうすれば Timer の使用もせずきれいにまとまります。本スクリは装着物に応じた変更を AO もしている状態でどう実装するかというのに対するアプローチの一例であることを前置きします。http://wiki.secondlife.com/wiki/LlSetAnimationOverride/ja