• カテゴリー別アーカイブ 6.LSL
  • script

  • boat script (type A)

    boat scriptは、ギア変速タイプがB、ギア変速なしがAと分けています。

    お約束、このスクリプトは私の製作記録として残しておきます。参考になさられてかまいませんが、動作やそれにまつわる損害等を保証出来ません。

    今回のfishing boat mm_expressでの変更点

    1. 設定ファイルにカメラの詳しい設定を書き正しく変更出来るようにした。
    2. アニメーションにllSetAnimationOverrideをつかってみる。(利点、負荷が軽くなるらしい?前のアニメを止めなくて、次のにかえられる。欠点 パーミション取得の確認が表示されて、うざい。そのため、ドライバー以外は見送った。あと、落ちたときなど、アニメーションが戻らないことが多い)
    3. 運転席が2カ所あるので、座ったあとアバターを移動させる。
    4. 不具合解消、CHANGE_LINKイベントで毎回パーミション取得していたので、最初だけにした。
    5. 不具合解消、ステアリングホイールがうまく回らなかった記入ミス修正(テストしてたプリムナンバー2をそのまま書いていた正くはLINK_THIS)
     続きを読む 投稿 ID 968

  • boat script (typeB)

    忘れないように個人的な記録です。プログラマーではないので、つこみ所満載でしょうが、やさしく見守ってやってください。アドバイス等は歓迎します。スクリプトがわかる方は改良して使って頂いてもかまいません。

    mm powerboat XS のスクリプトです。boat9というのが出てきますが、開発番号でpowerboat XSが9番目のボートだからです。ポーズ(アニメ)は自分で作っていますが、サウンドファイルは他の方のものを使っているので、各自用意してください。このページはビルダー向けに書いています。値をかえればものすごく速い乗り物も出来ますが、フリーズしたり、落ちたりする事が多くなります。そんなときボートが乗り捨てられないで、消えるように考えています。インワールドで他人に迷惑をかけないように、こころがけしましょう。:-)

    最初に出てくるboatbound scriptについて、最初にかいておきますが、LSLの説明を読むと、物理状態のオブジェクトにllApplyImpulse()などの関数で直接力を与えるのは良くないとなっております、実際ボートは水面に接してる時と離れたときでは極端に抵抗が違うように感じられます、そのため直進方向の力を加えて上下に揺らすようなことを来ると、水面を離れた瞬間に、宇宙のかなたに消えてしまうようなことがおきます。でも回転する力なら、まあおかしくなってもその場で回るだけだという安易な考えで使用しています。すみません。

    rootプリム内は

    続きを読む 投稿 ID 968


  • chair script

    egg chair や bar chair 回転椅子で使っているスクリプト
    モデリング時は全体が回転するため椅子の脚部のデザインは回転体である必要があります。
    アニメーションごとの位置調整はしていません。アニメ制作時最初のコマのデフォルトポーズを同じばしょからはじめて位置をあわせて作る必要があります。
    ポーズの数にあわせて、修正が必要です。(タブが消えてしまいすみません。)

    
    string animation_name0="mm_chair5_pose1";
    string animation_name1="mm_chair5_pose2";
    string animation_name2="mm_chair5_pose3";
    string animation_name3="mm_chair5_pose4";
    string animation_name4="mm_chair5_pose5";
    
    rotation startrot;
    rotation newrot;
    vector xyz_angles = <0,0,10.0>;
    vector angles_in_radians;
    key siton1 = NULL_KEY;
    
    vector sit_pos1 = <0.0, 0.4, -0.4>;//adjust the position
    vector sit_rot1 = <270.0, 0.0, 270.0>;//adjust the rotation and tilt
    
    integer animax = 5;//The total number of animation files
    integer animanum = 0;
    
    animachange()
     {
        list anms1 = llGetAnimationList(siton1);
        integer i1;
        for (i1 = 0; i1 < llGetListLength(anms1); i1++)
        {
           if(llList2Key(anms1, i1) != NULL_KEY)
           {
              llStopAnimation(llList2Key(anms1, i1));
           }
        }
    
        if (animanum == 1)
        {
           llStartAnimation(animation_name1);
        }
        if (animanum == 2)
        {
           llStartAnimation(animation_name2);
        }
        if (animanum == 3)
        {
           llStartAnimation(animation_name3);
        }
        if (animanum == 4)
        {
           llStartAnimation(animation_name4);
        }
     //Number of animation only add if statement
        else //animation pose last
        {
           llStartAnimation(animation_name0);
        }
     }
    
    default
    {
        state_entry()
        {
           llSitTarget(sit_pos1, llEuler2Rot(sit_rot1 * DEG_TO_RAD));
        }
    
       changed(integer change1)
        {
           if (change1 & CHANGED_LINK)
           {
              key av1 = llAvatarOnSitTarget();
              if (siton1 != NULL_KEY)
              {
                  if (av1 == NULL_KEY)
                   {
                       list anms1 = llGetAnimationList(siton1);
                       integer i1;
                       for (i1 = 0; i1 < llGetListLength(anms1); i1++)
                       {
                          if(llList2Key(anms1, i1) != NULL_KEY)
                          {
                             llStopAnimation(llList2Key(anms1, i1));
                          }
                       }
                       siton1 = NULL_KEY;
                       animanum = 1;
                       newrot = startrot;
                       llSetRot(startrot );
                  }
              }
              else
              {
                 if (av1 != NULL_KEY)
                 {
                    angles_in_radians = (xyz_angles * DEG_TO_RAD);
                    startrot = llGetRot();
                    newrot = startrot;
                    siton1 = av1;
                    llRequestPermissions(siton1, PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS);
                 }
              }
           }
        }
    
    run_time_permissions(integer perm1)
     {
        key perm_key1 = llGetPermissionsKey();
        if (perm_key1 == siton1)
        {
           if (perm1 & PERMISSION_TRIGGER_ANIMATION)
           {
              list anms1 = llGetAnimationList(siton1);
              integer i1;
              for (i1 = 0; i1 < llGetListLength(anms1); i1++)
              {
                  if(llList2Key(anms1, i1) != NULL_KEY)
                  {
                     llStopAnimation(llList2Key(anms1, i1));
                  }
              }
           }
        llStartAnimation(animation_name0);
        llTakeControls(CONTROL_UP | CONTROL_DOWN | CONTROL_RIGHT | CONTROL_LEFT, TRUE, FALSE);
        }
     }
    
     control(key id, integer held, integer change)
     {
        vector mlinear;
        vector mangular;
        if(change & CONTROL_UP && held & CONTROL_UP)
        {
           if(animanum < animax)
           {
              animanum++;
              animachange();
           }
           else
           {
              animanum = 1;
              animachange();
           }
        }
        if(change & CONTROL_DOWN && held & CONTROL_DOWN)
        {
           if(animanum > 1)
           {
              animanum--;
              animachange();
           }
        else
        {
           animanum = animax;
           animachange();
        }
     }
    
     if(held & CONTROL_RIGHT)
     {
        newrot = (newrot * llEuler2Rot(angles_in_radians) );
        llSetRot(newrot);
     }
    
     if(held & CONTROL_LEFT)
     {
        newrot = (newrot / llEuler2Rot(angles_in_radians ));
        llSetRot(newrot );
     }
    
     }
    }
    
    

    2014/5/3ごめんなさい、スクリプト中にゴミを発見、コピーペーストしたときに余計なものまでもってきちゃいました、llSetTimerEvent(15);のとこを削除、不要に負荷をつくってたようで。訂正。以上 みちえ


  • Street Lump script

    スクリプトを勉強していて、何を考えていたとか、覚え書きのようにスクリプト関連の記事を残していくことにした。

    街灯を作る必要ができて、手持ちのランタンのスクリプトから作ることにした。

    llGetSunDirection

    で、太陽の位置を調べて地平線(z=0)の上か下かで判断するらしい。LSL wikiのサンプルをみると

    
    integer lightsOn = -1;//not TRUE or FALSE
    
    CheckSun()
     {
     vector sun = llGetSunDirection();
     integer turnLightsOn = (sun.z < 0);
     if(turnLightsOn != lightsOn)
     {
     lightsOn = turnLightsOn;
     llSetPrimitiveParams([ PRIM_FULLBRIGHT, ALL_SIDES, lightsOn ]);
     }
     }
    
    

    となっている、integer lightsOn = -1;//not TRUE or FALSE integer turnLightsOn = (sun.z < 0);のあたりの処理の仕方がまだ理解できない、プログラマーじゃ無いし独学だからなーsun.zの値がマイナスの時だけ代入するの?それがlightsOnとへんかしてたら入れ替えてPRIM_FULLBRIGHTの最後の因数にあたえてオンオフできるの?マイナス値でいいのとかいっぱい疑問、ここはパスだな単純にif文でわけてオンかオフにしちゃおう。

    これをタイマーを使って定期的にチェックすればいいのか、次の問題はサイクルだな何分おきにチェックすればいいのか?SLの一日は4時間らしい、また昼3時間夜1時間のくりかえしらしい、1時間に1回ぐらいでもいいとおもってたけど夜が1時間なので1分ごとに調べることにした。(実際は5分ぐらいでももんだいなさそう)。次はユーザーインターフェースだ(笑)、出来るだけシンプルにしたい、メニューなど使うと時間切れ処理とかめんどうなので、やめる。細かい数値の変更はスクプを編集可能にし先頭の変数の値を書き直してもらうようにする。ノートカードとか読み込まない(ただめんどうなだけ)。タッチするだけで、オートモード、オン、オフのトグルスイッチとする。タッチするたびに、stateで切り替えることで実現する。タッチイベントで次のstateに飛ばしちゃった方がかんたんだろうてかんがえた。さてあとは、ライトの点灯時の処理だね、テクスチャーをフルブライトにするのはサンプルにあるから、あとはグローとライトの設定も一緒にすることにする、カンマで区切って列記すればいいそうだ。そうそう、かってにいたずらされないように、タッチイベントをオーナーか同じグループの人に限定することにしよう。

    以下 スクリプト (タブが消えて、すみません)

    
    //=========================================================
    //auto light script by Michie Yokosuka : 28-09-2010
    //=========================================================
    //
    //==============================
    //Light param
    //==============================
    vector Color = <1, 1, 1>;
    float Intensity = 1.0;
    float Radius = 7.0;
    float Falloff = 0.75;
    //==============================
    //Glow param
    //==============================
    float Gintensity = 0.03;
    //==============================
    // Script variables
    //==============================
    integer lightsOn = FALSE;
    //==============================
    
    CheckSun()
    {
     vector sun = llGetSunDirection();
     if ( sun.z < 0 && !lightsOn )
     {
     lightsOn = TRUE;
     llSetPrimitiveParams([
     PRIM_FULLBRIGHT, ALL_SIDES, lightsOn,
     PRIM_POINT_LIGHT, TRUE, Color, Intensity, Radius, Falloff,
     PRIM_GLOW, ALL_SIDES, Gintensity ]);
     }
    
    else if ( sun.z > 0 && lightsOn )
     {
     lightsOn = FALSE;
     llSetPrimitiveParams([
     PRIM_FULLBRIGHT, ALL_SIDES, lightsOn,
     PRIM_POINT_LIGHT, FALSE, Color, Intensity, Radius, Falloff,
     PRIM_GLOW, ALL_SIDES, 0 ]);
     }
    
    else
     {
    
    }
    
    }
    
    default
    {
     state_entry()
     {
     state autolight;
     }
    }
    
    state autolight
    {
     state_entry()
     {
     llSay(0, "set Auto Light!");
     CheckSun();
     llSetTimerEvent(60);
     }
    
    touch_start(integer total_number)
     {
     if (llDetectedKey(0) == llGetOwner() || llSameGroup(llDetectedKey(0)))
     {
     llSetTimerEvent(0);
     state lighton;
     }
     }
    
    timer()
     {
     CheckSun();
     }
    }
    
    state lighton
    {
     state_entry()
     {
     llSay(0, "light on!");
     lightsOn = TRUE;
     llSetPrimitiveParams([
     PRIM_FULLBRIGHT, ALL_SIDES, lightsOn,
     PRIM_POINT_LIGHT, TRUE, Color, Intensity, Radius, Falloff,
     PRIM_GLOW, ALL_SIDES, Gintensity ]);
     }
    
    touch_start(integer total_number)
     {
     if (llDetectedKey(0) == llGetOwner() || llSameGroup(llDetectedKey(0)))
     {
     state lightoff;
     }
     }
    }
    
    state lightoff
    {
     state_entry()
     {
     llSay(0, "light off!");
     lightsOn = FALSE;
     llSetPrimitiveParams([
     PRIM_FULLBRIGHT, ALL_SIDES, lightsOn,
     PRIM_POINT_LIGHT, FALSE, Color, Intensity, Radius, Falloff,
     PRIM_GLOW, ALL_SIDES, 0 ]);
     }
    
    touch_start(integer total_number)
     {
     if (llDetectedKey(0) == llGetOwner() || llSameGroup(llDetectedKey(0)))
     {
     state autolight;
     }
     }
    }
    
    

    以上が出来上がったスクリプト

    テスト後50行目あたりのCheckSun();を追加、夜間Rezしたとき、1分待たないと点灯しなかったため。とりあえずうまく動いてるみたいだ。出来上がった品は別の記事で。