ソラマメブログ
Mad Scripter's Lab ~ Main Lab ~ 姉妹サイト Mad Scripter's Lab 
河原町 =Shop eL=(ぇる)1号店=  Niseko3 =Shop eL=(ぇる)3号=
裏原宿 Mad Scripter's Lab  ※下の3店舗は閉店しました。



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入れてもらうよりはいいかと。( ̄ー ̄)


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



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

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

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





同じカテゴリー(LSLスクリプト)の記事画像
無料配布中の3D Pencil 試作版について
3D Pencil チュートリアル♪
3D Pencil 試作版無料配布☆
自動改札作ってみました。
スクリプト指南書
レーダーを作ってみよう。(その2)方角表示してみる。
同じカテゴリー(LSLスクリプト)の記事
 無料配布中の3D Pencil 試作版について (2008-09-26 21:33)
 3D Pencil チュートリアル♪ (2008-09-17 05:44)
 3D Pencil 試作版無料配布☆ (2008-09-06 01:34)
 自動改札作ってみました。 (2008-05-25 19:02)
 スクリプト指南書 (2008-04-06 22:28)
 レーダーを作ってみよう。(その2)方角表示してみる。 (2008-03-13 01:47)
Posted by MasterPoppy Amat at 22:28 │LSLスクリプト