Site search

Google
WWW を検索 backup-beta.blogspot.com を検索

2008年9月30日火曜日

LUV

LUVっていうSIMに、前はキャンプやサンドボックス、無料で10プリム置けるスペース、フリービー専用スペースとかあって、いろいろお世話になってたんですが、久しぶりに行ってみたら面影も全部なくなっててガランと変わってしまってますね。

無料スペースがなくなったのは私がプログ始める前だったので、もうかなり前の話ってことになるんですけどね^^;

でもサンドボックスは少しだけ残ってましたよ。。。て道の部分だけなので、区画を変えるの忘れてるんだと思いますけどw
http://slurl.com/secondlife/LUV/191/201/22


2008年9月29日月曜日

Lucky letter V1.3.1

最近ラッキーレターの数字を何とかできないかってお問い合わせが2件あったんですよ。自分でも少し気になってはいたんですけど、2件もあったってことは他に遠慮してるお客様もきっといるんじゃないかなって思いました^^;;

数字の出る確率は全部で10/63になってるはずなんですけど、やっぱり数字から始まる名前つけてるアバターってかなり少ないので、数字はもうひとまとめにしてもいいんじゃないかなってことなんですね。
そうすると、まとめた数字0~9は1/54の確率になりました。でもまとめてるので数字の方も当たる確率は少し上がってます^^
数字をひとまとめにする設定はメニューで切り替えにしました。
あと、★のパーティクルも追加しときました。

今回のバージョンは購入者様全員にお送りしましたが、手違いで届いてないとかメタコマースで購入された方はご連絡くださいね^^


2008年9月28日日曜日

プリムに記録されたデータを消すスクリプト

一度スクリプトが実行されるとスクリプトを削除しても残る情報ってありますよね^^;
フローティングテキストや、パーティクル、Sitテキスト、Sitポジション、カメラなどですね。
消すには文字列のところに空の値を入れたらいいんですが、数値の場合は全部0にして初期値に戻します。

default
{
    state_entry()
    {
        llSetSitText("");
        llSitTarget(ZERO_VECTOR, ZERO_ROTATION);
    }
}


車を作ってみたときカメラや座る位置まで記録されるって知らなかったので、何でときどき窓の上に座っちゃうことがあるのかなって悩んでたんですよ。途中で親プリムを別のプリムに変更して位置をずらしたので、このプリムに情報が残ってたってことなんですけどね^^;


こんな感じでまとめたスクリプトをプリムにドロップすると、プリムはリセットされてスクリプトは実行後消滅するので便利かなって思いますw
// プリムに記録されたデータを消す
default
{
    state_entry()
    {
        llSetText("",<0,0,0>,0);  // フローティングテキスト消去
        llParticleSystem([]);  // パーティクル消去
        llSetTouchText("");  // パイメニューTouch初期化
        llSetSitText("");  // パイメニューSit Here初期化
        llSitTarget(<0,0,0>,<0,0,0,1>);  // 座る位置初期化
        llSetCameraEyeOffset(<0,0,0>);  // カメラアイオフセット初期化
        llSetCameraAtOffset(<0,0,0>);  // カメラ位置オフセット初期化
        llRemoveInventory(llGetScriptName());  // このスクリプトをコンテンツ内から削除
    }
}

このスクリプトは消滅するので自分のインベントリーの中で作成してくださいね。
ZERO_VECTOR=<0,0,0> 、 ZERO_ROTATION=<0,0,0,1> になります。

2008年9月27日土曜日

OnRezのベンダー

OnRezのベンダーって普通に出品してる商品が買えるようになってるのかなって思ってたんですけど、ベンダーに登録した商品のページにベンダーを置いてる場所のリンクが表示されて、そこへテレポートしたら買えるようになってたんですね。

うーん、何が言いたいのかわかりにくいですかね?^^;
OnRez見てて欲しい商品のページにベンダーのリンクがあったら、OnRezにアカウントなくてもそこへテレポートして買えるってことなんですよ。これってとても便利だと思います^^ でも知らない人多いかもですねw


2008年9月26日金曜日

巨大なメディアスクリーン発売♪

3枚セットで販売予定だったスクリーンなんですが、もう一回り大きいサイズを追加して4枚セットで販売を開始しました^^


40×30m 16プリム
30×22.5m 9プリム
20×15m 4プリム
10×7.5m 1プリム
迫力ある大画面で動画を鑑賞できますよ^^

テレビ画面とかのスクリプトと同じで土地に設定された動画を映すだけのシンプルなモニターですが、裏表両面に映すこともできるようにしてます。あと、つまんないですけど、4画面、9画面、16画面に分割表示もできます^^;


(注)この製品は土地のメディアを設定できる権限をお持ちの方が対象です。

CSL MALL店SL-Shopping.net-Mall店に置いてきました。
お値段はL$30です。宜しくお願いします^^



2008年9月25日木曜日

ユーチューブTVスクリーン V1.0.4

ビデオリストに記入する動画のタイトルに日本語を使うと、ダイアログのバイト数をオーバーしてエラーになる可能性があるので、日本語は非対応ということにしてたんですね。
エラーにならないように日本語文字列を切り詰める関数も書いてたんですが、これ通すとダイアログ出るのが遅くなったので使用は断念してたんですよ^^; でも、Monoでコンパイルしてみたら結構早くなって大丈夫そうだったので、この関数を使うように変更しました^^

日本語など英数字以外の文字は11文字で切り詰められます。。。まあ古いバージョンでもそのくらいに抑えて使って頂くと大丈夫なんですけど^^; 最新版ご希望の方おられましたら交換いたしますね^^

Monoでコンパイルしたら容量も64KまでOKになるらしいので、アニメーションベンダーやマルチパネルのベンダーなど、アイテムリストにいっぱい登録しようとするとエラーが出るものも順次コンパイルし直して入れ替えていきます。こちらも最新版ご希望のお客様はご連絡くださいね^^

14時20分頃追記: ベンダーは全て入れ替え完了しました。1プリム9アイテムベンダーは別に問題ないんですけど、ついでに変更しときましたw


2008年9月23日火曜日

巨大スクリーン

メディアテクスチャの位置とサイズを調整してプリムをつないだら大きなメディアスクリーンができるんですね。9プリムで30×22.5mになりましたw

これでテレビとか観賞したら迫力あっていいかなって思ったら。。。んー、やっぱりちょっと大きすぎました^^;
でも広い土地持ってる人はどーんと置いたら良いかもって気がするので、1プリム、4プリム、9プリムをセットで少し機能もつけて販売してみようかなって考えてます^^ まあ作ろうと思えば簡単に作れると思うので高い値はつけられないですけどねwww


Torleyさんのビデオチュートリアルを映したところです。
上 30×22.5m 9プリム
左 20×15m 4プリム
右 10×7.5m 1プリム


2008年9月22日月曜日

プロフ写真を表示するスクリプト

今回はプロフの写真を表示するスクリプトです。ちょっと出かけて、はっと気がついたら自分の写真が表示されてたってことよくありますよね^^;;

Random AV Profile Projectorが公開されてるので、これをそのまま使用してるのが多いと思いますw あと、スクリプト得意な方はこれを解読して使うのかなって思いますけど、私は頭弱いので長いの読むの苦手なんですよwww

でも仕組みは理屈がわかれば簡単なんです。アバターのプロフィールのページがあって(<UUID>のところはアバターのキー)
http://world.secondlife.com/resident/<UUID>
そのページにある画像(プロフ写真)のURLに、インワールドのプロフ写真のテクスチャUUIDが含まれているんですよ。
<img alt="profile image" src="http://secondlife.com/app/image/<テクスチャUUID>/1" class="parcelimg" />

写真を貼ってないプロフのページの画像は下記のようにURLが違うので、上記のような画像URLが含まれてたら、その部分からUUIDを取得するようにしたらいいですよね^^
<img alt="profile image" src="http://world.secondlife.com/images/blank.jpg" class="parcelimg" />

これだけわかれば、あとはllHTTPRequestと文字列の処理ができればオッケーだと思います^^


タッチしたアバターのプロフ写真をプリムの面番号0に表示するようにしてみました。
// プロフィール写真取得
key http_request_id;

default
{
    touch_start(integer total_number)
    {  // タッチすると
        key agent=llDetectedKey(0);  // アバターのキー取得
        string url="http://world.secondlife.com/resident/";
        url+=(string)agent;  // プロフのURL
        http_request_id=llHTTPRequest(url,[],"");  // HTTPリクエスト送信
    }

    http_response(key request_id, integer status, list metadata, string body)
    {
        if (request_id == http_request_id)
        {
            string img_url="http://secondlife.com/app/image/";  // プロフ写真用URL
            integer j=llStringLength(img_url);  // URLの長さ
            integer i=llSubStringIndex(body,img_url);  // bodyの写真URLの位置
            if (i > -1) {  // 写真があったら
                string str=llGetSubString(body,i+j,-1);  // UUIDまでの位置
                i=llSubStringIndex(str,"/");  // UUIDの後の/までの位置
                str=llGetSubString(str,0,i-1);  // UUID
                llSetTexture(str,0);  // 面番号0にプロフ写真表示
            }
            else {  // 写真がないとき
                llSay(0,"No image");
            }
        }
    }
}



2010年7月9日追記: プロフページの仕様が変わって、もうヘッダ部分から取得するようにしないと動作しないと思います。
http://shop-chihiro.blogspot.com/2010/04/blog-post.html

2008年9月21日日曜日

フルパーで売ってくれって?

この前SLXでオンラインインジケーターを買って頂いたお客様から、フルパーミッションで売ってくれないかって問い合わせがあったんですよ。でも価格をいくらにするとか考えるのがややこしかったのでお断りしました^^;

まあ普通のオンラインステータスボードに、rezしたときプロフの写真を自動で取ってきて表示するようになってるだけの簡単なものなんですが^^;
それでもSLXに登録してから、うちの製品の中で今これが一番売れてます^^

何か期待して一生懸命作った商品って、どうも売れてないような気がするんですけどねwww
ユーチューブTVスクリーンも期待してなかったのに結構売れてます。ホントにありがとうございます^^


2008年9月20日土曜日

数量限定で配布するスクリプト

今回はアイテムを限定何個とか決めて配布するためのスクリプトです^^

配布をカウントして限定数に達したら終了って感じですけど、一人のアバターに何度もゲットされないようリストアップしとく必要がありますねw

リストを使うのであまり限定数をたくさんに設定すると、リストが増えてきたときに
[7:48] Object [script:New Script]: Script run-time error
[7:48] Object [script:New Script]: Stack-Heap Collision

こうゆうエラーになります^^;
テストでは150~160くらいでエラー出ました。環境によって前後しそうなので、余裕みて120くらいまでにしとくと安全かな?って思います。


配布するオブジェクトを1個入れてくださいね。コンテンツ内に変化があったときカウントが初期化されるようにしてます。
// 個数限定で配布
integer limit=30;  // 限定数
integer count=0;
list av_list;  // 渡したアバターのリスト用
string object;

init()
{
    count=0;  // カウント初期化
    av_list=[];  // リスト初期化
    // コンテンツ内のオブジェクトを取得
    object=llGetInventoryName(INVENTORY_OBJECT,0);
    // オブジェクトが入ってないときはカウントを最大数に限定数に上げる
    if (llGetInventoryType(object) == INVENTORY_NONE) count=limit;
    else {  // そうでないときは限定数表示
        llWhisper(0,"Limit "+(string)limit+" item(s).");
    }
}

default
{
    state_entry()
    {  // 最初はinitへ
        init();
    }

    changed(integer change)
    {
        if (change & CHANGED_INVENTORY) {
            init();  // コンテンツ内が変わったらinit
        }
    }

    touch_start(integer total_number)
    {
        key agent=llDetectedKey(0);  // タッチしたアバターのキー
        integer i=llListFindList(av_list,[agent]);  // リストと照合
        if (i < 0 && count < limit) {  // リストに載ってなくて限定超えてない
            count++;  // カウント加算
            av_list+=[agent];  // リストに登録
            llSay(0,"Distributed "+(string)count+" of "+(string)limit);  // 配布数表示
            llGiveInventory(agent,object);  // 渡す
        }
        else if (i < 0) llSay(0,"Sorry, sold out.");  // ごめんね品切れ
        else llSay(0,"Sorry. One person, one item.");  // ひとり1個ね
    }
}

2008年9月19日金曜日

ラッキーレター V1.2.1

ラッキーレターは誤ってパネルの下のところにテクスチャをドロップして貼り付けてしまっても、メニューからリセットかけると元に戻るようになってるんですね^^
この部分ってラッキーチェアーみたいに説明が英語で簡単に書かれてるので重要なんですよ。このボードが何なのか知らない外人さんが見ても理解してもらえますからね^^

以上は発売当初から実装されてたんですが、今回のバージョンアップは更にボードの大きさを変えても文字部分のプリムがずれないように修正を加えました。。。まあ、コントロール+シフトで引き伸ばすとずれないんですが、あまりプリムいじらない人はやり方知らなかったりとかありますので^^;

最新版ご希望の購入者様はご連絡頂けたらお送りしますので宜しくお願いします^^

ラッキーレターはL$100で販売中です♪ 一般的にラッキーボードと呼んでもらってもOKですが、既にあったラッキーボードの商標を侵害しないようにということで製品名をラッキーレターと名づけてます。ラッキーチェアに対してワンダーチェアみたいな感じですかねwww


要望掲示板が放置されてる件

ソラマメさんはSLMaMeスタッフに伝えよう!掲示板ブログをもう忘れてるんじゃないかなって、投稿する前からいやな予感がしてたんですけどねwww

ランキングのリンクより目立ってないし。。。;

9月27日0時20分頃追記: スタッフの方のコメントが。。。8月末の要望からコメント入ってなかったのでホント忘れてるのかと思いましたよ^^;


2008年9月18日木曜日

YouTube TV screen パーミッション変えました

YouTube TV screenはコピー可、譲渡不可にしてたんですが、土地がグループの所有になってるとグループに譲渡しないと使えないんですね。なのでコピー不可、譲渡可に変更いたしました。

土地に複数設置して使うと現在の動画が合わなくなるのでコピー可ってあまりメリットないかなって思うんですね。それに、うちも店舗に2種類とも置く余裕ないのでw あと、似たのがあったら間違えたとかありそうだしwww

既にご購入されたお客様で、グループに譲渡できなくて使えなかった方は最新版をお送りしますのでご連絡くださいね。宜しくお願いします。


サンタモニカのジョイントショップ

http://beta.slmame.com/e323748.html のショップなんですが、SantaMonica Shopping Mall 2 の改装が終わって、ファルコンさんのL-SEVENと珠姫さんのMILK CROWNと私のSHOP CHIHIROとでJOINT SHOPにしてもらいました^^

SHOP CHIHIROの看板は木目調のダサい看板なので、一緒にしたら浮くかなって思ってファルコンさんに新しいの作ってもらったんですよw ありがとうございます^^
地図はこちら



ファルコンさんはネタ系のAFKツール、それと呪術用のベルトですかね?藁人形セットが付いてて妖しいところがナイスですwww 珠姫さんは愛嬌のある可愛いタイニーアバターですね^^
うちはYouTube TV screen、Texture stocker、Online indicatorなど置いてみましたが、ハートのピアスはちょっと浮いてるかもw


それから、wildcatさんのSeyshelles Meisterは向かい側の角地に移動されてます^^

改装後の第二モールはサンタモニカらしいっていうか、第一モールと同じような雰囲気になってますね。モール経営者のりこさんから改装記念のブレスレットやアイテムキャンプのドレス頂きました^^
花柄なのでちょっと千尋には派手かなって気もしたんですが、着てみたらハデすぎってこともなかったです^^ まあ歩いたらパンツ見えちゃうんですけど^^; 私は身長高めだからかな?着たら歩かないよう気をつけますねwww

2008年9月17日水曜日

やばいっSLXで古いの売っちゃってた orz

一度作り直して販売してたスカルプテッドプリムの階段なんですが、SLXのマジックボックスには間違えて古い型のほうを入れて販売してしまってましたwww

上下の角のところが写真と違うので苦情がきてもいいはずなんですが、問い合わせが一件もないってことは古いほうでも満足しちゃったってことなんでしょうか?@@; それか逆に改良されてるって思っちゃってたり?www ★5つ入れてくれてる人もいるし^^;

持ち物はきちんと整理しとかないとだめですね^^;;


2008年9月16日火曜日

ミュージックチェンジャーのスクリプト

今回は土地の音楽を切り替えるミュージックチェンジャーのスクリプトです^^

土地に音楽を設定して流すには、その土地を持ってるとか権限が必要なんですが、llSetParcelMusicURLの関数で簡単にできます。
これで音楽やネットラジオとかのストリーミング配信を土地に設定したらビューワーの再生ボタンで聞けるようになります^^


ストリーミング配信されてる音楽を曲リストのところに入れてくださいね^^
オーナーがタッチするとダイアログ出て、選んだ曲が土地に設定されます。
// ミュージックチェンジャー
list music=[  // 曲リスト
// "曲名", "URL",
"ピアノ曲","ピアノ曲のURL",
"ユーロビート","ユーロビートURL",
"○×ラジオステーション","○×ラジオステーションURL",
NULL_KEY];  // データの最後のカンマ用
integer len;
string text;  // ダイアログのメッセージ用
list num;  // ボタン用
integer listen_handle;
integer CHANNEL;

default
{
    state_entry()
    {
        len=llGetListLength(music)-1; // NULLキー省いた曲リストの長さ
        string str;
        integer i;
        for (i=0; i < len; i+=2) {  // ダイアログのテキストとボタンを準備しとく
            str=(string)(i/2+1);  // 番号を計算して文字列にする
            text+=str+". ";  // 曲に振る番号と点
            text+=llList2String(music,i);  // 曲名
            text+="\n";  // 改行
            num+=[str];  // ボタン用の番号
        }
    }

    touch_start(integer total_number)
    {
        key agent=llDetectedKey(0);  // タッチしたアバターのキー
        if (agent != llGetOwner()) return;  // オーナーでないときは中断
        llListenRemove(listen_handle);  // listen解除
        CHANNEL=llCeil(llFrand(2147483646));  // listenチャンネルのランダム化
        listen_handle=llListen(CHANNEL, "", agent, "");  // listen開始
        llDialog(agent, text, num, CHANNEL);  // ダイアログ表示
    }

    listen(integer channel, string name, key id, string msg)
    {
        llListenRemove(listen_handle);  // listen解除
        if (channel == CHANNEL && id == llGetOwner()) {
            integer i=(integer)msg;  // 押されたボタンの整数値
            string url=llList2String(music,i*2-1);  // 曲リストから対応するURLを取り出す
            llSetParcelMusicURL(url);  // 土地にミュージックURL設定
        }
    }
}

最大12曲まで登録できますが、曲名が長くなりすぎて制限を越えるとエラーでダイアログでなくなります^^;
http://beta.slmame.com/e359278.html

2008年9月15日月曜日

Mono

最近Monoってよく聞きますよね。スクリプトが性能よくなるらしいんですが、あまりよく知らなかったんですよ^^;; でも自称スクリプターじゃないから、知らなくっても平気だったりしますけどwww

今日はTorleyさんの動画いろいろ見てたら、Monoってのがあったので見てみました^^


Understanding Mono
http://jp.youtube.com/watch?v=cGoM9p7q1jk

んー、まあスクリプトの処理が速くなるってことでしょうね^^;
でもコンパイルし直しが必要なんですか。。。面倒なんですねw
http://wiki.secondlife.com/wiki/Mono/ja もよく読んで勉強しとかなきゃって思うんですけど、ビューワーも完全に対応になるまで気にしないことにしときますねwww

ところで、動画の2:00くらいのところの計測装置?のシーンで出てくる名前ってガ民通信の人?
前プログを拝見して只者じゃなさそうだなって思ってたんですが、こんな動画に名前が出てるってことは、やっぱり只者じゃなかったんですね@@;
スクリプトにホントに詳しそうな人ってソラマメではほとんど目立たない存在って感じしますよね。


英語できないのにSLXやOnRez登録してませんかw

私も英語が苦手なのでちょっとやばいんですがw 同じように苦手な方も結構登録されてるんじゃないかなって思いますwww
でもやっぱり苦情がきたときとかホント怖いんですよね^^; そゆときのためにお客様に何とか応対できるよう英語に慣れときたいですね^^

もうかなり前です。普通に店舗で売れた商品なんですが、眼鏡を2種類とも購入されたお客様から苦情がきたんですよ^^;

表現が難しかったので細かいとこは翻訳通してもよくわからなかったんですが、もうあんたの店では買わない!店をリンデンに通報する!みたいな感じで、かなり怒ってるらしいのがわかりました;
それで、何があったのかって聞いてみたら、やっぱり怒ってて返事なかったんですよ^^;
その頃SLのサーバーがよく再起動してたんですね。今思えばHavok4への切り替わりだったのかなって思うんですけど。。。その影響で買ったアイテムが渡らなかったのかなって思って、一応メガネを送ってみたんですね。そしたら受け取ってもらえたみたいなんですが、それでも返事なかったんです;;


なのでもう諦めてたんですけどね。30分ほど過ぎてから返事がきました。レンズが7種類ってなってるメガネを買ったのに1個しか入ってないじゃない! 透明レンズのメガネが欲しくて検索してやっと見つけて買ったのに!ってw お客さん、タッチしてダイアログで変えられるんですよ^^;
でもプロフみたら数日前に生まれたニュービーで、装着して上手くタッチできなかったんです。それでカメラで向き変えるのをを説明しようとしたんですが、そんなややこしい英語できませんでしたwww
戸惑ってると、透明に変えたメガネを送ってほしいって言われたので、なるほどって思ってその通りにしたら喜んでくださいました><
それで完全に気を取り直してくれたみたいで、うちの他の種類のメガネも買いたいって言ってくれたんですよ。ホント嬉しかったです^^
でもSHOP CHIHIROでは、眼鏡は既にご購入頂いた2種類しか製造してなかったので、もう売れなかったんですけどねwww

2008年9月14日日曜日

ラッキーレターの裏技

この前バージョンアップしたラッキーレターなんですが、パーティクルは賞品のテクスチャ、クローバー、ハートから選べるようになってるんですね。

でも、賞品のテクスチャの状態で2枚目のテクスチャを入れると2枚目をパーティクルとして使うようになりますw
ただアルファベット順になるので2枚目のテクスチャの名前を工夫しないといけないですけど。 zzzflower とか }flower みたいにですねwww


マップトラックバックを活用

マップっていうのがソラマメのトップ右側にあるんですが、ショップの位置なんかをトラックバックしたら少しは宣伝になるかもってことで使ってみましたwww

簡単に手順を書きますね^^
1.記事の投稿画面で本文記入欄の下に「記事にマップを挿入」というリンクがあるのでそれをクリックします。
2.マップのページが開きますので、ページ右上の入力欄にSIM名とX、Y、Zの座標を入れて「検索する」ボタンを押すと入力した場所の地図が出ます。
3.ページ左下の「ソラマメマップにトラックバックする」のところでアイコンを選んで、「マップにトラックバック」ボタンを押します。すると記事投稿画面の「トラックバック送信先を追加」の欄にURLが入ります。これで記事を投稿したらOKみたいですw

トラックバックは以上でできますが、マップのページの「記事にソラマメマップへのリンクを挿入」で記事からマップへ行けるようにしといたほうがいいですね^^


9月14日22時頃追記: 前と同じトラックバックのURL使えるかなって思ったんですが前の記事になってしまいましたw 毎回マップ出してやらないとだめみたいですね^^;


2008年9月13日土曜日

グループに譲渡

最近オブジェクトをグループで所有することができるって知りました^^;;
アクティブなグループ名を取得で教えてもらったのがきっかけなんですけどねw 回答者のふりして教えてもらってますwww
あと、ユーチューブTVスクリーンをお買い上げ頂いたお客様からもグループ譲渡できないかってお問い合わせ頂いたので、知識のなかった私は慌てちゃったんですね^^;

なので、今日はグループに譲渡する方法をちょっと試してみました^^

オブジェクトを編集で選んでグループを設定します。そしてグループ分担にチェック入れると譲渡のボタン(Deed)が有効になります。

それで、ボタン押して譲渡ってするとオーナーのところがグループの所有になりました^^

今回Chihiroっていうグループを一応作ってやってみたんですけど、グループ所有に変わるとグループオーナーでもスクリプトも開けないし、llOwnerSayも聞こえないみたいです。うーん、ややこしそうですねwww

9月13日22時10分頃追記: 譲渡不可のアイテムはグループにも譲渡できません。

9月24日7時頃追記: グループオーナー、オフィサーなど土地の権限を持つ方でないと譲渡できません。


ラッキーレター

うちで販売してるラッキーレターっていう、ラッキーチェアーラッキーボードみたいにアバター名の始まりの一文字が一致すると賞品がもらえる装置なんですが、当たったときyou winっていうだけで寂しかったんですね。

なので、当たるとパーティクルが散って音が鳴るように改良してみました。音はパパパパッパパー♪ってのが持ち物のLibraryの中にあったのでそれを流用したんですけど、変だったら他のに入れ替えてくださいね^^;

今回のバージョンアップはバグ修正じゃないんですが、まだそんなに台数出てなかったので購入者様にお送りしました^^ あまり売れてないってことですねwww
但し、メタコマースでお買い上げいただきました方はこちらでわからないので送れません。お手数ですけどラッキーレターを設置してる場所のランドマークをお送りください。確認したらお渡ししますので宜しくお願いします。

(注)正確にはイニシャル一致で当たりじゃありませんw


9月14日4時5分頃追記: 意味ちょっとわかりにくいかなってことで追記しときます。
イニシャル聞かれたら何て答えますか? 普通ファーストネームとラストネームの始め1文字ずつを取りますよね。だからイニシャルの意味は頭文字でも常識的には通常2文字になるんですね。
このボードは2文字一致じゃないし、ラストネームの頭に一致しても当たりじゃないので、イニシャル一致なんて書いたら変でしょwww

2008年9月12日金曜日

ベスト3に2つもランクイン@@

現在メタコマースの人気商品ランキングの1位にSHOP CHIHIROの階段、3位にテクスチャストッカーがランクインしています。うちの商品がこんな上位に2つもくるなんてとても光栄です。お買い上げくださいました皆様、ホントにありがとうございます!!

登録したころは売り上げなんか期待していなかったんですよ。それでも登録したらちょっとは売れるかなって、心の奥では僅かな期待はしてたんですがホント全く売れなかったんですねwww なので、もう全然売れなくってもいいかなって感じになってたんですが、特に今月に入ってぐらいから売れ出してきました。マメタがたくさん出回ってきたってことですかね^^

SLXOnRezではフリー商品を別にすると一番売れてるオンラインインジケーターが、メタコマースだとまだ1個も売れてないってのが謎なんですがwww


2008年9月11日木曜日

プリムカウンターのスクリプト

今回は土地のプリム数を表示するプリムカウンターのスクリプトです^^

プリムカウンターはllGetParcelPrimCountllGetParcelMaxPrimsでプリム数の情報を調べて表示させたらいいと思います。。。て、リンク先にそのまま使えそうなスクリプト出てますね^^;

でもタイマーで一定時間ごとにプリム数をチェックして、フローティングテキストで表示する簡単なスクリプトを書いてみたので載せますねw プリムカウンターとしてよくありそうなタイプじゃないかなって思います^^


プリム数はトータルと最大のみにして、llGetParcelDetailsで土地の名前と広さの表示を加えてみました。
// プリムカウンター
string count_prim()  // 文字列を返すのでstring
{
    vector pos=llGetPos();  // 現在位置
    list parcel=llGetParcelDetails(pos, [PARCEL_DETAILS_NAME, PARCEL_DETAILS_AREA]);  // 土地の名前と広さを取得
    string name=llList2String(parcel,0);  // リストから名前を取り出す
    string area=llList2String(parcel,1);  // リストから広さを取り出す
    integer total=llGetParcelPrimCount(pos,PARCEL_COUNT_TOTAL,FALSE);  // 使ってるプリム数
    integer max=llGetParcelMaxPrims(pos,FALSE);  // 最大プリム数
    // 表示用に文字列を整形
    string str=name+"\n"+area+"sqm";
    str+="\nTotal prims: "+(string)total;
    str+="\nMax prims: "+(string)max;
    return str;  // 戻り値に文字列を返す
}

default
{
    state_entry()
    {
        llSetTimerEvent(1);  // 最初は1秒後に表示
    }

    timer()
    {
        llSetTimerEvent(60);  // 1分ごとに更新
        llSetText(count_prim(),<1,1,1>,1.0);  // count_primの戻り値を表示
    }
}

2008年9月10日水曜日

木を作るとシダになるんですがw

土地に少し植物を置いたんですよ。それで自分でも試しに作ってみようかなって思って、ちょっとやってみました^^

建造で木や草を作ると1プリムのものになるんですね。でも木(ツリー)を作るとシダみたいなのができて、サイズとかは編集できるんですけど普通のプリムとは違ってテクスチャも変えられないみたいなんですw んー、何かやり方間違えてるんですかね?www


2008年9月9日火曜日

テレビ画面とかのスクリプト

今回は土地に設定した動画やウェブページを表示するメディアスクリーンのやり方です。

方法はとても簡単で、土地に設定してるメディアテクスチャと同じテクスチャをオブジェクトの好きな面に直接ドロップして貼りつけたら完成です^^
Make your own media screen http://youtube.com/watch?v=-SJu23Ya4WY

でき上がったモニター画面にはSHOP CHIHIROで発売中のユーチューブTVスクリーンなどのシステムを使って変換したYouTubeムービーなんかも映ります^^

まあこれでオッケーかなって気もするんですけど、土地に設定されたテクスチャを自動取得する簡単なスクリプトを書いてみましたw


土地にテクスチャが設定されてないときは、Default Media Texture(持ち物のライブラリにあります)を土地に設定します。あと、タッチで電源オン・オフできるようにしてみました。
// メディアスクリーン
integer face=4;  // 面番号
key media_texture="8b5fec65-8d8d-9dc5-cda8-8fdf2716e361";  // デフォルトメディアテクスチャ

set_texture()
{
    list media=llParcelMediaQuery([PARCEL_MEDIA_COMMAND_TEXTURE]);  // 土地のメディアテクスチャを取得
    key texture=llList2Key(media,0);  // 取得したリストをキーに変換
    if (texture == NULL_KEY) {  // テクスチャが設定されてないとき
        texture=media_texture;  // 変数textureにデフォルトのテクスチャ入れて
        llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_TEXTURE, texture]);  // 土地にテクスチャ設定
    }
    llSetTexture(texture,face);  // オブジェクトにテクスチャ設定
}

default
{
    state_entry()
    {  // 最初は電源オフの状態なので
        llSetColor(<0,0,0>,face);  // 黒にしとく
    }

    touch_start(integer total_number)
    {  // タッチイベント
        if (llGetColor(face) == <1,1,1>) {  // 色が白だったら(電源オンなら)
            llSetPrimitiveParams([
                PRIM_FULLBRIGHT,face,FALSE,  // フルブライトをオフ
                PRIM_COLOR,face,<0,0,0>,1.0]);  // 色を黒にする
        }
        else {  // そうでないとき(電源オフのとき)
            set_texture();  // set_textureでテクスチャ設定
            llSetPrimitiveParams([
                PRIM_FULLBRIGHT,face,TRUE,  // フルブライトをオン
                PRIM_COLOR,face,<1,1,1>,1.0]);  // 色を白にする
        }
    }
}

このスクリプトは土地をお持ちの方など、その土地のメディア設定できる権限持ってる人向けになります。
10月30日11時頃追記: デフォルトメディアテクスチャにはTEXTURE_MEDIAっていう扱いやすい定数がありました。

2008年9月8日月曜日

カスタマーサポート in English

うちの製品は簡単に使えるように作ってるんですね。だから説明書も付属してないのがほとんどで、ベンダーや集客用品もホントに簡単な説明書が付いてるだけなんですよ。なぜかっていうと、自分が機械に弱くって難しい説明書見ても理解できないような人だからなんですけどね^^; あと、英語苦手なので外国のお客様から質問されて困らないようにって感じですねwww

それでも今日はベンダーを購入頂いた海外のお客様から質問を受けたんですよ。白いボックスに赤い枠がどうとか言ってるようで、意味もさっぱりわからなかったんですが、見てほしいということで仕方なくお客様のところに調べに行ってきました。
でも、英語で聞かれても半分くらいは何言ってるのかよくわからないんですよねwww なので私は何のアドバイスもできなかったんですが、先方がSLビューワーのビーコン出してたらしくて、それに気がついて自己解決されました^^; ああ、よかった。。。ホントSLXやOnRez登録してから、こうゆう機会も増えてきたと思うので英語もっと勉強しとかないとやばいですねw


2008年9月7日日曜日

暗くなると自動点灯するランプのスクリプト

今回は太陽が沈んで暗くなったら自動で点くランプのスクリプトです^^
今回もとても簡単なスクリプトなので、ホントはもうひと工夫ほしいところなんですけどw でもまあ、わかりやすくていいかなって思います^^;

llGetSunDirectionで太陽の方向を調べられるんですね。関数の戻り値がベクターなので、このZの値が0以上だったら太陽が昇ってるって感じですね。

ベクター型変数(ベクトル型)で v を定義したらZの値は v.z で扱えます。
vector v;
v=<v.x, v.y, v.z>;

なので
vector v=<1.0, 2.1, 3.4>;
だったら v.z=3.4 ですね


タイマーで一定時間ごとに太陽の高さを調べて、地平線より下だったらランプを点灯させます。
ランプはllSetPrimitiveParamsでグローとライトを使いました。
// 暗くなると自動点灯するランプ
default
{
    state_entry()
    {
        llSetTimerEvent(30);  // タイマー30秒ごと
    }

    timer()
    {
        vector v=llGetSunDirection();  // 太陽の方向
        if (v.z < 0) {  // 太陽が沈んでたら
            llSetPrimitiveParams([
                PRIM_GLOW,ALL_SIDES,0.2,  // グロー0.2
                PRIM_POINT_LIGHT,TRUE,<1,1,1>,1.0,10.0,0.75]);  // ライト点ける
        }
        else {  // そうじゃないとき
            llSetPrimitiveParams([
                PRIM_GLOW,ALL_SIDES,0.0,  // グローなし
                PRIM_POINT_LIGHT,FALSE,<0,0,0>,0,0,0]);  // ライト消す
        }
    }
}

でも太陽の方向って、ビューワーを自分好みで昼や夜に変えても変わらないんですよねw

Textures (1prim 9items vendor)

OnRez1プリム9アイテムベンダーを購入頂きました海外のお客様から、ベンダーに付属のサンプルテクスチャとテンプレートテクスチャがダウンロードできないって報告を受けました。それで確認してみたらパーミッションを間違えててフルパーになってなかったんですよ orz
てことは、他に購入されたお客様はPCに保存せずに同じようなテクスチャ作って使ってるってゆうことなんですかね?@@;
一応CSL MALL店にパーミッション修正したテクスチャを置いときましたので宜しくお願いします。

1prim 9items vendor have a sample indexed texture and a template of indexed texture. But these textures were not full permissions. Therefore, there are fixed textures at SHOP CHIHIRO in CSL MALL.

10月2日追記: 特に必要な方いないみたいだったので撤去しました。もし必要な方おられましたら連絡くださいね。
If you need permission fixed textures, then IM me.


ユーチューブTVスクリーン発売♪

YouTube対応テレビなんですが、一応完成にして販売を開始しました^^ ただの1プリムのパネルになっちゃったのでテレビとはいえないんですけどねwww


ビデオリスト(プレイリスト)に書かれたYouTube動画を簡単な操作で再生できるようにしてます。
あと、他のプレーヤーが連続再生とか搭載してるので結局つけたんですが、一定時間ごとのタイマーで連続再生やランダムプレイとかボイスコマンドで実行できるようにしてみました。

プレイリストの日本語タイトルは文字数がオーバーする可能性ありなので一応非対応です。ホントはそれをチェックする関数書いたんですが、それ通すと重くてダイアログ出るのがかなり遅くなったのでやめましたwww V1.0.4からこの関数を使うようにしました。

先ほどSL-Shopping.net-Mall店に置いてきました。
お値段のほうは特価L$50です。宜しくお願いします^^

9月7日1時半頃追記: この製品は土地をお持ちの方が対象です。

9月18日18時頃追記: 土地オーナーがグループになってても使用できるようにパーミッションをコピー不可、譲渡可に変更しました。

9月19日6時半頃追記: アップルQuickTimeがインストールされてないと動画が見れないので、Windows使ってる方は入れ忘れてないかチェックしてくださいねー^^
Linuxは前使ってたときに動画流してるSIMに行ってみたんですが、やっぱりQuickTimeがないので見れないみたいでした^^; アドビやリアルネットワークスとかリンデンみたいにリナックス対応製品出してる企業を見習ってほしいですよねwww

9月19日19時40分頃追記: うちのPCのリナックスは現在もうアンインストールされてて試せないんですが http://bluejay.slmame.com/e370231.html (blue jayさん)には動画OKみたいに書いてありますね。。。最近のLinuxは映るようになったのかな?^^;

9月24日6時30分頃追記: パッケージの説明直すの忘れてたので直しました^^;
土地オーナーがグループのとき、グループオーナーなど土地の権限を持つ方のみがグループに譲渡できます。グループの所有になるとグループメンバーのみ操作可能に固定されます。

9月26日0時20分頃追記: V1.0.4からMonoでコンパイルして軽くなったので、日本語タイトルも一応対応になりました。
グループで使用されるときは、ビデオリストをグループ分担にするとメンバーで編集できると思います。


2008年9月6日土曜日

ダイアログの文字数制限

YouTubeコンバーターはダイアログで使うリストの処理に間違いがあって
YouTube2MP4 [script:YouTube2MP4 (main)]: Script run-time error
YouTube2MP4 [script:YouTube2MP4 (main)]: Stack-Heap Collision

ちょっと使ってると、こうゆうエラー出ることがわかりましたwww そんなエラーの報告はなかったので、皆さんほとんど使ってなかったんですかね;;

さて、YouTube対応テレビがそろそろ完成しそうなんですが、あとプレイリスト表示するダイアログをどうしようかなって悩んでます^^;

llDialogにメッセージ入れるとき最大512バイトって制限があるんですね。文字数をオーバーするとエラーになってダイアログ出ませんw
Object: llDialog: message too long, must be less than 512 characters

英数字だけだったら結構余裕あるんですけど
string str;

default
{
    state_entry()
    {
        integer i;
        for (i=0; i < 51; i++) str+="1234567890";
    }

    touch_start(integer total_number)
    {
        key agent=llDetectedKey(0);
        llDialog(agent,str,[],0);
    }
}

str+="1234567890"; のところを str+="あいうえお"; ってするとエラーになっちゃうんですよ;;
日本語だと2倍じゃなくて3倍くらい容量使うみたいです。よくわからないんですけどUnicodeかURLエンコードみたいなデータになってるんですかね?
llStringLengthで文字数を調べても、「a」も「あ」も1文字って出るので、ダイアログに日本語いっぱい入ったときエラー出ないように何か別のいい方法考えとかないとって思うんですが、ややこしそうなので日本語使用は動作保障外ってことにしといて格安で販売したらいいかなwww


2008年9月5日金曜日

家建てるなんて

SLやってて、ずーと家なんかイラネって思ってたんですけど、土地借りたらそのキレイに整地された区画が何か置いてくれって感じで私に訴えてるような気がしたんですよwww
なので家を建てました。。。いや、ホントは建てたんじゃなくて、持ち物にフリービーでゲットしてた家があったのでそれをちょこっと置きました^^;

家っていうよりロッジみたいな建物で、中には特に何も置いてないんですけど、それでも寂しかった土地の雰囲気が変わったなって思います^^
まあ海の底なので、家が建ってたら不自然なんだろなって気もするんですけどねwww


2008年9月4日木曜日

アニメーションを全部止めるスクリプト

今回はアバターが再生中のアニメーションを全部止めるスクリプトです。

タッチしたアバターのアニメを止めるようにします。普通によくある簡単なスクリプトですね。ちょっといいネタが思いつかなかったのでwww
llGetAnimationListで再生中のアニメのリストを取得して1つずつ止めます。


タッチするとアニメーションを操作するためのパーミッション許可を要求するダイアログが出ますので、これを許可すると止まります^^
// アニメーションを全部止める
list anim_list;

default
{
    touch_start(integer total_number)
    {
        key agent=llDetectedKey(0);  // タッチしたアバターのキー
        anim_list=llGetAnimationList(agent);  // 再生中のアニメーションのリスト
        llRequestPermissions(agent,PERMISSION_TRIGGER_ANIMATION);  // アニメのパーミッションリクエスト
    }

    run_time_permissions(integer perm)
    {
        if (perm & PERMISSION_TRIGGER_ANIMATION)
        {
            integer i;
            for (i=0; i < llGetListLength(anim_list); i++)
            {  // リストのアニメの数だけループして
                llStopAnimation(llList2Key(anim_list,i));  // アニメを1個ずつ停止
            }
            llStartAnimation("stand");  // 立った状態のポーズをとらせる
        }
    }
}

2009年1月30日追記: 製作中のHUDに組み込んでて気がついたんですが、AOを使ってないとアニメーションが止まった後、アバターを動かすまで最後に再生されたアニメーションのポーズをとったままの状態になるみたいです。なので for ループでアニメーションを停止した後、普通のスタンドポーズ(stand)を再生するよう修正しました。

2008年9月3日水曜日

YouTubeコンバータをテレビに

気がつくとソラマメ管理画面のマメタが一ケタ多かったので、メタコマースがバグってる。。。やばい。撤退したほうがいいかも?なんて思っちゃったんですが、そうじゃなくてキャンペーンで1000マメタもプレゼントしてくれてたんですね@@; ありがとうございます!! 疑っちゃってごめんなさい^^;;
あと、メタコマースでもちょっとずつ売れてきました。お買い上げくださいました皆様、ありがとうございます^^

前テキトーに作ったYouTubeコンバータなんですが、テストできる土地が借りれたので、今これをテレビモニターに改造中なんですよ。ちょっとつまずいてますけどw
llParcelMediaCommandListのPARCEL_MEDIA_COMMAND_LOOPって動かないみたいなんですね^^; バグなのかな? でも、流しっぱなしだと変換してるサーバーに余分な負担かけちゃうと思うのでループとかはできてもしないほうがいいですかねw
よくわからないんですけど、とにかく普通に再生できるようにして完成させたいなって思います。特に変わった機能は付かないですがwww


自動ドアちょっと改良

最近修正ばっかりしてるような気がする千尋です^^;;

フリー配布してる自動ドアなんですが、中のConfigを書き換えることでセンサーの範囲と閉じるまでの時間を設定できるように修正してみました。まあこのドアをホントに建物に使ったりはしないんじゃないかなって思うんですが、暇つぶしにでも遊んでやってくださいねw

この商品は現在、TokyoZERO番地のフリマJapaTownのフリーショップ、それからSL-Shopping.net-Mall店にも置いてます。宜しくお願いします^^


2008年9月2日火曜日

土地だけはフリービーないですよねw

ベーシックユーザーなのでメインランド以外で、自分がオーナーになれる土地で格安なのを探してるんですが、なかなか条件に合ったのがないんですよね^^;

今回は店舗を増やしたいんじゃなくて、土地の権限に関係するスクリプトのテストがしてみたいんですよ。だから、狭くてプリム数は少なくってもいいんです。あと、スクリプトをテストするので、レンタル規約がゆるいところがいいですw

貧乏人なので高くても月L$1000ぐらいまでで、借りれても1ヶ月とか短期間でやめちゃうかもですがwww わがままですねぇ^^;;

9月3日4時頃追記: 初めてショップを借りたときから度々お世話になってるwildcatさんが良い条件で土地を用意してくれました>< ホントにいつもありがとうございます。費用も予算内なのでこれなら続けて借りれそうです^^


2008年9月1日月曜日

どっから見ても正面に見えるスクリプト

みんなで作ろう。教えて!セカンドライフ!どこから見ても正面になるスクリプトっていうのが載ってたんですよ。
それで同じようなのがもうちょっと簡単にできそうだったので書いてみました。パーティクルでどっちから見てもテクスチャが正面から見えます^^
これはやっぱり広告、看板なんかにいいんでしょうね。

9月2日14時頃追記: みんなで作ろう。教えて!セカンドライフ!に投稿されてた記事が消えてました。どーなってるんでしょう?


オブジェクトのコンテンツ内にテクスチャを入れると、オブジェクトは透明になってパーティクルでテクスチャを表示します。
オブジェクトの大きさ(XとY)を変えるとテクスチャもその大きさになります。でもパーティクルの制限で0.04~4mの範囲になりますがw
// どっちから見ても正面になるテクスチャ
init()
{
    // コンテンツ内のテクスチャ取得
    string texture=llGetInventoryName(INVENTORY_TEXTURE,0);
    // テクスチャがないときはオブジェクトを不透明に
    if (llGetInventoryType(texture) == INVENTORY_NONE) {
        llSetAlpha(1.0,ALL_SIDES);
    }
    else {  // そうじゃないときは透明にする
        llSetAlpha(0,ALL_SIDES);
    }
    vector scale=llGetScale();  // オブジェクトの大きさ取得
    llParticleSystem([
        PSYS_PART_FLAGS,PSYS_PART_EMISSIVE_MASK,
        PSYS_SRC_BURST_RATE, 0.0,
        PSYS_SRC_BURST_SPEED_MAX, 0.0,
        PSYS_SRC_MAX_AGE, 0.0,
        PSYS_PART_MAX_AGE, 0.5,
        PSYS_PART_START_SCALE, <scale.x,scale.y,0>,  // サイズ設定
        PSYS_SRC_TEXTURE, texture]);  // テクスチャ設定
}

default
{
    state_entry()
    {  // 最初はinit実行
        init();
    }

    changed(integer change)
    {
        if (change & CHANGED_INVENTORY) {
            init();  // コンテンツ内が変化したらinit
        }
        else if (change & CHANGED_SCALE) {
            init();  // 大きさが変わったらinit
        }
    }
}

動作は問題ないと思いますが、パーティクルは詳しくないので変な値にしてるとこあるかもですwww
9月1日21時40分頃追記: テクスチャとサイズの変数がグローバル変数になってたんですがムダなので修正しました^^;

ランダムに喋るスクリプト

今回は言葉をリストに登録しといて、それをテキトーにチャットで喋らせるスクリプトです^^

簡単に書いてみたんですが
// ランダムに喋る
float time=180;  // 喋る間隔(秒)
integer len;
list message=[  // 喋る言葉リスト
"こんにちは^^",
"いらっしゃい♪",
"お元気ですか?",
NULL_KEY];  // 最後のデータにカンマを付けたいので最後はNULLキー

default
{
    state_entry()
    {
        len=llGetListLength(message)-1;  // NULLキーを引いたリストの長さ
        llSetTimerEvent(0.1);  // 最初は0.1秒でタイマー始動
    }

    timer()
    {
        llSetTimerEvent(time);  // timeの間隔でタイマー設定
        integer i=llFloor(llFrand(len));  // リストの長さぶんの乱数発生して
        llSay(0,llList2String(message,i));  // リストの対応する言葉をチャットで発言
    }
}

んー、余りにも簡単すぎですかねwww まあ簡単なほうが理解しやすくていいんですけどね^^
でも、ちょっとつまんないかなって思って少し改造してみましたw


オーナー限定のスイッチを付けて、一定時間ごとだったタイマーも乱数で毎回変動させてみました^^
予想外の処理も入れることになったので、ちょっと長くなっちゃいましたが特別難しいところはないですよね。
// ランダムに喋る(改)
float time_min=120;  // 喋る間隔(最小)
float time_max=180;  // 喋る間隔(最大)
integer power=FALSE;  // スイッチ用
integer tmp=-1;  // 乱数と重複しないように -1
integer len;
list message=[  // 喋る言葉リスト
"こんにちは^^",
"いらっしゃい♪",
"お元気ですか?",
NULL_KEY];  // カンマを付けたいので最後はNULLキー

default
{
    state_entry()
    {
        len=llGetListLength(message)-1;  // NULLキーを引いたリストの長さ
    }

    touch_start(integer total_number)
    {
        if (llDetectedKey(0) == llGetOwner()) {  // オーナーのみ
            if (power) {  // スイッチが入ってたら
                llSetTimerEvent(0);  // タイマー停止
                llWhisper(0,"停止");
            }
            else {  // そうでないとき
                llSetTimerEvent(0.1);  // 0.1秒後にタイマー開始
                llWhisper(0,"開始");
            }
            power=!power;  // ブーリアン変数の値を反転
        }
    }

    timer()
    {
        integer t=llFloor(llFrand(time_max-time_min));  // 最大と最小の差で乱数発生
        llSetTimerEvent(time_min+t);  // タイマー設定
        integer i=llFloor(llFrand(len));  // リストの長さぶんの乱数発生
        while (len > 1 && i == tmp) {  // リストの言葉が複数で、乱数が前回と同じときは
            i=llFloor(llFrand(len));  // また乱数発生
        }
        tmp=i;  // 乱数を比較用に保存
        llSay(0,llList2String(message,i));  // リストの対応する言葉をチャットで発言
    }
}

最初はオフにしてるのでstate_entryではタイマー起動してないです。
timerイベントでタイマー用と言葉用の2つの乱数を発生させたら、言葉が3~4回連続で同じになってしまったので同じ言葉にならないよう処理を加えました^^;
http://wiki.secondlife.com/wiki/LlFrand/ja を見たら、なるほど、あまり精密でないってことなんですねw

2009年9月9日追記: オーナー限定に if (llDetectedKey(0) != llGetOwner()) return; としてましたが、これだと同時にタッチがあったとき正常動作しないと思いますので修正しました。