ソラマメブログ
河原町 =Shop eL=(ぇる)1号店=
Niseko3 =Shop eL=(ぇる)3号店=
裏原宿 Mad Scripter's Lab
姉妹サイト Mad Scripter's Lab

2008年08月12日

実験的呼び鈴(コード公開)


まいどです(´・ω・`)ノ

ポピーであります。

ひさびさのスクリプト講座でーす。

今回はオンラインステータス表示・呼び鈴スクリプトなんですが、

ただOnline・Offlineを表示するだけとか、

ただクリックして定型文なり入力したStringをスクリプトIM送るだけでは

イマイチ芸がないので今回はちょっとへんてこな方法を試してみました。


ではさっそくコードから。

注:今回公開しているスクリプトはポピーが個人的な趣味で実験的に組んだものです。
  何度か動作は確認してはいますが、読者の皆様がコピペあるいは改造して
  個人使用・商用利用した際に生じた動作不良や不具合に対して補償はできません。
  悪しからず御了承願います。


//llKey2Name()の特性を利用したOnline Status
//MasterPoppy Amat

key req;
key owner;

default
{
state_entry()
{
llSetText("高機能な呼び鈴\nタッチすべし。",<1,1,1>,1);
owner = llGetOwner();
//このコードではオーナーのKeyがコンパイルした時点で代入されるきりなので
//他人に譲渡すると動作がおかしくなるので注意。
//このままコードを使用するときは自分でスクリプトをコピペして使うべき。
}

touch_start(integer total_number)
{
if(llKey2Name(owner) != "")
{
llSay(0,"オーナーはこのSIMか隣のSIMにいるようです。");
//llKey2Nameが空のstringを返せば
//入力したKeyのAgent(アバター)は同一SIM・隣接SIMにいない。
}
else
{
req = llRequestAgentData((key)owner,DATA_ONLINE);
//どうやらこのSIMにはいないようなのでOnline判別にゴー
//↓dateserver()へ。
}
}

dataserver(key requested, string data)
{
if((req == requested) && (data == "1"))
//おなじみのllRequestAgentData()を使ったOnline Status確認。
//dataはstring型であることに注意。
{
llSay(0,"オーナーはONLINEですが他のSIMにいるようです。");
}
else
{
llSay(0,"オーナーはOFFLINEのようです。");
}
llSleep(1.0); //一呼吸
llSay(0,"何か用事の方はチャットログから↓クリックするとプロフィールが出るのでそっからIMどぞ。");
llSay(0,"secondlife:///app/agent/" + (string)owner + "/about");
//SLURLのプロフィール表示機能key型変数をStringにキャストして挟むことで一般化。
}
}




今回のスクリプトの機能は3つです。

タッチすると⇒
・Onlineの場合、オーナーがオブジェクトがあるSIMまたはその隣接SIMにいるかを判別
―①
・あるいは他のSIMにいるかを判別―②
・Offlineの場合はプロフィールを表示するSLURLを0チャンネルで発言―③

といった感じです。



まずは①の機能解説から

使っている関数はllKey2Name()です。
LSL Portal:LlKey2Name/ja

llKey2Name()の本来の機能はKey型変数を本来の名前、すなわちオブジェクト名やアバター名に直して返す、というものですが

LSL Portalに以下の記述があります。

"idがそのSim及びその付近に居なかった場合は空のstringが返されます。
"

これを拡大解釈して、llKey2Name()からreturnされた中身で

A.空でないstring、つまりは名前が返された場合⇒アバターは同一SIMか隣接SIMにいる。同時に当たり前だけどOnlineである。
B.空のstringが返された場合⇒アバターはほかのSIMにいる、またはOfflineである。

というふうに見方を変えて使っています。

コードの20~25行目に相当する部分ですが、A.のときはOnlineでかつ近くにいるということを示すので
そのことをチャットで情報を吐かせています。
"オーナーは"の部分はお好みで"ぽぴは"などとあだ名にするなり、
llKey2Name(llGetOwner())を使って一般化してもいいでしょう。


一方B.のケースですが、これだけではOnlineかOfflineかもわかりません。
こっちはよくあるOnline StatusのようにllRequestAgentData()を使って判別しています。
LSL Portal:llRequestAgentData
LSL Portal:Dataserver/ja

この場合にdataserver(key query_id, string data)で返ってくるdataの値なんですが、
どうもstringとしてOfflineなら"0"が、Onlineなら"1"が返ってくるみたいです。(´・ω・`)
(integerなTRUEとFALSEが返ってくると思いこんでハマった。)

Dataserver()の仕様を見ても



なんやら変則的。

まぁリンデンの気まぐれに惑わされるのはここまでにして、

これでめでたくOnlineでありかつ他のSIMにいる場合と、落ちちゃってる場合の判別ができたわけですが、

ついでなのでもう一個おまけ機能つけました。

よくあるIM送信機能付き呼び鈴ではタッチしてListenを開いて⇒拾ったStringをスクリプトIMで送信という流れをくんでいますが、

ポピはスクリプトIM好きじゃないんです。


おなじIMでもヒトの温かみのある(謎)アバターどうしのIMが好きです(*´ω`*)

というわけで用事のあるかたには直にIM送ってもらいたいです。(´・ω・`)

ここで登場するのが『secondlife://』。

リンク先のページにある

/app
  • /agent
    • /<agent_id>
      • /about open agent's profile, with 2nd Life tab selected


を使います。たとえば筆者MasterPoppy AmatのUUIDは72c03405-8305-48d9-ad18-f512f9db67f9なんですが、
(個人情報掲載!?Σ( ̄□ ̄|||)・・・・・・・・・・・・・・・というほどでもないと思うが。)

インワールドでアバターまたはオブジェクトに
secondlife:///app/agent/72c03405-8305-48d9-ad18-f512f9db67f9/about
と発言させてチャットログからリンク補完されたテキストをクリックすると
ぽぴのプロフィールが表示されます。

こいつを48行目のように
llSay(0,"secondlife:///app/agent/" + (string)owner + "/about");
※変数ownerはkey型で定義
としてやると一般的にオーナーのプロフィールを表示するSLURLを発言してくれます。

ユーザからするとひと手間かもですが、
オブジェクトのオーナからプロフ辿ってIM入れてもらうよりはいいかと。( ̄ー ̄)


機能とか仕組みの解説は以上かな。



ウチのラボで実際に設置してるんですが、オブジェクトのデザインが残念です;

僕と違って いいセンスをお持ちのみなさんはもっと素敵になオブジェクトで作ってくださいね。^^;





  
Posted by MasterPoppy Amat at 22:28Comments(0)TrackBack(0)LSLスクリプト

2008年05月25日

自動改札作ってみました。


はいどうも~。おもっきしブログさぼり気味のポピーです。

ひさびさの新作(といいつつだいぶ前にできたものを掘り起こした^^;)紹介です。

SLで自動改札作ってみました。





例の如くノートPC鞭打って 動作紹介動画です。




  
続きを読む
Posted by MasterPoppy Amat at 19:02Comments(2)TrackBack(0)LSLスクリプト

2008年04月06日

スクリプト指南書



  何気なくSLのインストールディレクトリを開いてみたら







なんじゃこりゃw すっげー気になる!w

前からこんなんあったっけか。


と、いうわけで開いてみる→ ( "C:\Program Files\SecondLife\lsl_guide.html" )

※上のフルパスをブラウザのアドレスバーにコピペすれば一発で開けます。




これは。。。。。。LSLスクリプト指南書!w



なにこれ。詳しい、かつめっちゃ丁寧やん。


とくに11.3らへんみてフイタ。






AAっすかwww

たしかにわかりやすいし、

HTML文書単体でグラフィカルに説明しようとおもったらこうなるw


しかしおもろすぎ。


まじめなんだか何なんだか・・・・・w




これ読んでもっかい勉強しょうかな。

  
Posted by MasterPoppy Amat at 22:28Comments(2)TrackBack(0)LSLスクリプト

2008年03月13日

レーダーを作ってみよう。(その2)方角表示してみる。

前回→ レーダーを作ってみよう。(その1)



ほいじゃ レーダーに8方位表示機能をつけてみましょう。

完成品のSSをもう一度。





アバター名+距離の次に8方位を表示するようにしています。

なくてもいいですがある方が断然便利なのでつけた機能です。


さてさて8方位表示・・・・・・・どします?w





  
続きを読む
Posted by MasterPoppy Amat at 01:47Comments(8)TrackBack(1)LSLスクリプト

2008年02月29日

レーダーを作ろう。(その1)

前回→ レーダーを作ってみよう。(その0)

レーダー製作の核となるのが llSensorRepeat の使い方の理解であります。

いきなりですがさっそくレーダーぽいものを作っちゃいまっしょう。


string txt;
//フローティングテキストに表示する文字列を代入する変数

vector v;
float R = 96; //センサーの範囲

default
{
state_entry()
{
llOwnerSay("Rader On");
llSensorRepeat("", "", AGENT, R, TWO_PI, 1.0);
//1秒ごとにセンサー起動
}

no_sensor()
{
llSetText("No Avator" , <1,1,1>, 1);
//センサーに何も反応がなければ No Avator と白字で表示する
}

sensor(integer total_number)
{
integer i;
integer r;
//if(DetectedKey(0)==llGetOwner())
//{
// i=1++;
//}
////
//REZ設置するタイプのセンサーだとこの処理を加える必要があるが、
//HUDだとOwnerはDetecte(=検出)しないので特に必要ない
////

for ( i = 0; i < 8; i++ )
{
if ( llDetectedKey(i) != NULL_KEY)
{
v = -llGetPos() + llDetectedPos(i); //相対座標ベクトル
r = llRound(llVecMag(v)); //相対距離:四捨五入しておく
txt += llDetectedName(i) + " : " + (string)r +"m" + "\n";
//txt変数に i 番目に検出したアバターの名前を相対距離(m)を改行コードとおもに書きこんでいく
}
}
llSetText(txt, <1,1,1>, 1); //フローティングテキストに出力
txt = ""; //出力内容のクリア。→1秒後に次回のsensor
}
}
  
続きを読む
Posted by MasterPoppy Amat at 07:26Comments(2)TrackBack(0)LSLスクリプト

2008年02月29日

LSL色付けツール導入

sabroさん (→http://sabro.slmame.com/ )のLSL色付けツール導入を導入してみた。

※表示が普通のときはツールを置いてるサーバーが落ちてる時だともいます。

default
{
state_entry()
{
llSay(0, "Hello, Avatar!");
}

touch_start(integer total_number)
{
llSay(0, "Touched.");
}
}


これはかなりいいです。
  
タグ :LSL便利
Posted by MasterPoppy Amat at 06:50Comments(0)TrackBack(0)LSLスクリプト

2008年02月27日

レーダーを作ってみよう。(その0)

こんつわ。最近スクリプトが面白くてたまらないポピーであります。



フリーアイテムにしろ、有料アイテムにせよ、
スクリプト作品でよく見かけるのが「レーダー」です。
よく見かける割にはあんまりソース公開してるところがなさげです。

便利だからよく使ってる(つか常用してる)んですが、
どれもどうもしっくりこないというか、
ここがもうちょっととこうだったらいいのにな~って思う部分があったりします。

というわけで今回はレーダーつくっちゃえ!という運びになりました。



とりあえず完成品はこんな感じ。↓  
続きを読む
Posted by MasterPoppy Amat at 14:24Comments(0)TrackBack(0)LSLスクリプト

2008年01月29日

おあそびで拡声器作ってみた。


 お遊びで拡声器作ってみました。イベントのスタッフの方とか使うやつかな。





ひだりの赤マルがスクリプトを仕込んだHUD。

僕自身は普通にチャットで発言してるだけです。

100m先ぐらいまで聞こえると思います。






タッチでON/OFF切り変えれます。





タッチするとオーナー名とオブジェクト名を同期する仕組みです。

OFFにするとオブジェクト名はmegaphoneにもどります。







ソースコード乗っけときます。
HUDかなんかにボタン1こ追加して
仕込んでおくくらいが使い勝手がいいとおもいます。

簡単なのでスクリプトの練習に適してるのではないでしょうか。







default
{
    state_entry()
    {
        llSetObjectName("megaphone");
        llSetText("Off",<1,1,1>,1);
    }


    touch_start(integer total_number)
    {
        if(llDetectedKey(0) == llGetOwner())
        {
            state on;
        }
    }
}




state on
{
    state_entry()
    {
        llSetObjectName(llKey2Name(llGetOwner()));
        llSetText("On",<1,1,1>,1);
        llListen( 0, "", llGetOwner(), "" );
    }
   
    touch_start(integer total_number)
    {
        if(llDetectedKey(0) == llGetOwner())
        {
            state default;
        }
    }
   
    listen(integer channel, string name, key id, string message)
    {
        llShout(0,message);
    }
}

  
Posted by MasterPoppy Amat at 21:35Comments(0)TrackBack(0)LSLスクリプト