セカCHU☆

SecondLifeのこと

お菓子の袋作成その2

2009年03月06日 23時48分45秒 | セカンドライフのすくりぷと
scriptを書いてなかったので、のせますね


テレポートしたときにアニメが外れちゃうのが嫌で、
お行儀悪いなとは思いながらも15秒毎にアニメのパーミッションを取得しまくっちゃってます
あと、計算方法はもっと簡単になるかも!
私おバカだからこれ以上よく分かりませんでした・・・

いちおう最初のListに落としたいobjectの名前と、
次のListに落とした時に出すsoundの名前を書けば、どんなのでも落とせるようになるよ
その時は、落し物が一時オブジェクトになってるかどうか気をつけてね

 scriptここから 
list drop = ["almondfoil","pocky","eda","kinoko","itachoco","chocopie","heart","heartchoco","almondc"];
list se = ["cartoonsplit","pop","BOING"];
integer status = 0;  //ステータス。{0 = 装着, 1 = Rez}

default
{
 
  state_entry()  //いちばんさいしょ
  {
    //パーミッションを取得して、タイマーをセットします
     llRequestPermissions(llGetOwner(),PERMISSION_TRIGGER_ANIMATION);
    llSetTimerEvent(12.0);
  }

 
  attach(key keyid)  //装着したとき
  {
    if (keyid != NULL_KEY){
      //装着した時にだけ、state_entryからやり直します
      llResetScript();
    }
  }


  on_rez(integer param)  //地面に置いたとき
  //インベントリから出した時も同じなので装着した時も動いていますが、
  //attachも動くのでステータスの内容は0にリセットされているみたいです
  {
    status = 1;  //ステータスに1をセットします
  }

   
  timer()  //タイマーの時間が来るたび
  {
    list details = llGetParcelDetails(llGetPos(),[
    PARCEL_DETAILS_NAME,
    PARCEL_DETAILS_DESC,
    PARCEL_DETAILS_OWNER,
    PARCEL_DETAILS_GROUP,
    PARCEL_DETAILS_AREA]);
    //全ての住人にBuild許可もしくは土地オーナーの場合にだけ、チョコポロリ
    //許可されたグループでもrezは可能ですが、今回は対応しません
    //ステータスが装着状態じゃないとポロリしません
    if((llGetParcelFlags(llGetPos()) & PARCEL_FLAG_ALLOW_CREATE_OBJECTS ||
       llGetOwner() == llList2Key(details,2)) &&
       status == 0){
      //念のためアニメのパーミッションを取得します
      llRequestPermissions(llGetOwner(),PERMISSION_TRIGGER_ANIMATION);
      //落し物をlistからランダムに取得して、1こ落っことします
      integer dropno = (integer)llFrand(9.0);
      //落とした音をlistからランダムに取得して、1つ鳴らせます
      integer dropse = (integer)llFrand(3.0);
      //装着するとアバターの座標が基準になるみたい。
      //x,yはSIM座標です。
      //このままではアバターの向きが変わっても座標は変わりません。
      //だから三角関数を使って、向きの角度を考慮に入れた座標を作成します。
      vector rezpos = llGetPos();
      float rezposx = rezpos * <1,0,0>;  // x座標取り出し
      float rezposy = rezpos * <0,1,0>;  // y座標取り出し
      float rezposz = rezpos * <0,0,1> + 0.7;  // z座標取り出し
      float rezrot  = llRot2Euler(llGetRot()) * RAD_TO_DEG * <0,0,1>;
      if (rezrot > 0){
        rezrot = -360 + rezrot; //3時の方向(東)を0度とした角度に変換します
      }                         //時計回りにするため、値をひっくり返します
      float rezrotrad = 1 * 2 * PI * llFabs(rezrot)/360; //角度をラジアン値に
      rezposx = rezposx + 0.3 * llCos(rezrotrad);  //SIM座標+自分の正面
      rezposy = rezposy - 0.3 * llSin(rezrotrad);  //SIM座標+自分の正面
      //自分の正面0.3mの距離に、listのチョコをrezします
      llRezObject("drop_"+llList2String(drop,dropno),<rezposx,rezposy,rezposz>,ZERO_VECTOR,ZERO_ROTATION,0);
      llPlaySound(llList2String(se,dropse),1);
    }
  }

 
  run_time_permissions(integer perm)  //パーミッションが取得できたら
  {
    //アニメーションを実行します
    if (perm & PERMISSION_TRIGGER_ANIMATION) {
      llStartAnimation("holdbag");
    }
  }

 
}
 scriptここまで 


最新の画像もっと見る