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ここまで
テレポートしたときにアニメが外れちゃうのが嫌で、
お行儀悪いなとは思いながらも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ここまで