サインボード(オンラインチェッカー)
概要
いわゆる、オンラインだけど店を留守にしているときに、来訪者にコールしてもらうという趣旨のものです。売られているものは「オンライン / オフライン」の判定のみのものが多いですが、このスクリプトはそれに加え、「店内にいるかどうか」の判定も行います。
オンラインかつ店内にいるとき
わざわざオンラインであることを伝える必要がないので、お店のロゴなどを表示させておくとスマートです。この場合にクリックした人がいても、サインボードは反応しません。
オンラインだが店内にいないとき
オンラインであることを示し、クリックすることでオーナーを呼び出すことができます。オーナーにはIMと同時にダイアログが表示されます。
また、IM中には次のような便利な情報が含まれています。
- タッチした人のプロフィールを見ることができるクリックリンク(secondlife://app/agent/<アバターのUUID>/about)
- このサインボードを設置した場所へTPできるクリックリンク(secondlife://<SIM名>/x/y/z)
オフライン時
オフラインであることを示します。このテクスチャーが表示されている時にクリックしても、何もおきません。
コード
- signboard.lsl
// General string my_name = "Sign Board"; string default_tex = "default"; string online_tex = "online"; string offline_tex = "offline"; integer face = 1; string owner_name; string shop_name; string sim_name; vector my_pos; string tp_pos; uuSetup(){ llSetObjectName(my_name); owner_name = llKey2Name(llGetOwner()); my_pos = llGetPos(); shop_name = llList2String(llGetParcelDetails(my_pos, [PARCEL_DETAILS_NAME]), 0); sim_name = llGetRegionName(); tp_pos = "secondlife://" + sim_name + "/" + (string)((integer)my_pos.x) + "/" + (string)((integer)my_pos.y) + "/" + (string)((integer)my_pos.z); llSetTexture(default_tex, face); llSetTimerEvent(10.0); } // Change texture uuChange(integer near, integer online){ if (near){ llSetTexture(default_tex, face); action = FALSE; }else if (online){ llSetTexture(online_tex, face); action = TRUE; }else{ llSetTexture(offline_tex, face); action = FALSE; } } // Action integer action; integer waiting = FALSE; integer d_ch = -33215; integer handle; key queryid; string call_person_data; uuAction(key id){ if (action && !waiting){ waiting = TRUE; call_person_data = "secondlife:///app/agent/" + (string)id + "/about"; llSay(0, "ただいま" + owner_name + "を呼び出しています。空いている席におかけになってお待ちください。"); llSay(0, "Now calling " + owner_name + "... Please wait."); string touched_person = llKey2Name(id); llDialog(llGetOwner(), touched_person + "さんがお見えです。" + shop_name + "にお戻りください。", ["戻った"], d_ch); llInstantMessage(llGetOwner(), touched_person + "さんがお見えです。" + shop_name + "にお戻りください。"); llInstantMessage(llGetOwner(), call_person_data); llInstantMessage(llGetOwner(), tp_pos); llSetTimerEvent(180.0); handle = llListen(d_ch, "", llGetOwner(), "戻った"); } } uuSorry(){ llListenRemove(handle); llSay(0, "申し訳ありませんが、" + owner_name + "は取り込み中のようです...。後ほどIMを送ります。"); llSay(0, "Sorry... Maybe " + owner_name + " is busy..."); waiting = FALSE; llSetTimerEvent(10.0); } // Flow default{ state_entry(){ uuSetup(); } touch_start(integer total_number){ uuAction(llDetectedKey(0)); } timer(){ if (waiting){ uuSorry(); }else{ queryid = llRequestAgentData(llGetOwner(), DATA_ONLINE); } } listen(integer channel, string name, key id, string message){ llListenRemove(handle); waiting = FALSE; llSetTimerEvent(10.0); } dataserver(key query_id, string data){ if (query_id == queryid && data == "1"){ if (llOverMyLand(llGetOwner())){ uuChange(TRUE, TRUE); }else{ uuChange(FALSE, TRUE); } }else if (query_id == queryid && data == "0"){ uuChange(FALSE, FALSE); } } }
スクリプトの解説と設定
1. 準備するもの
テクスチャー3枚
オンライン用
オンラインかつ近くにいないときに表示されるテクスチャーです。このテクスチャーが表示されている時にクリックすると、オーナーを呼び出すことができます。
「online」という名前で保存し、コンテンツ内にドロップします。
オフライン用
オフライン時に表示されるテクスチャーです。このテクスチャーが表示されている時にクリックしても、何もおきません。
「offline」という名前で保存し、コンテンツ内にドロップします。
デフォルト用
オンラインであり、敷地内にいる場合に表示されるテクスチャーです。このテクスチャーが表示されている時にクリックしても、何もおきません。
「defalut」という名前で保存し、コンテンツ内にドロップします。
2. ユーザ関数について
uuSetup()
uuSetup(){ llSetObjectName(my_name); owner_name = llKey2Name(llGetOwner()); my_pos = llGetPos(); shop_name = llList2String(llGetParcelDetails(my_pos, [PARCEL_DETAILS_NAME]), 0); sim_name = llGetRegionName(); tp_pos = "secondlife://" + sim_name + "/" + (string)((integer)my_pos.x) + "/" + (string)((integer)my_pos.y) + "/" + (string)((integer)my_pos.z); llSetTexture(default_tex, face); llSetTimerEvent(10.0); }
初期設定を行います。
設置地点の座標はllGetPos()で取得し「my_pos」へ、土地名はllGetParcelDetails()関数で取得し「shop_name」へ、SIM名はllGetRegionName()関数で取得し「sim_name」へ格納します。
これら取得したデータをもとに、クリックするとテレポート可能な「secondlife://SIM名/x座標/y座標/z座標」という形をつくり、「tp_pos」に格納します。
llSetTexture(default_tex, face)のface値はそれぞれの環境に合わせて書き換えてください。テクスチャーを切り替える面を指定する数値で、いちお、ココに解説が書いてあるにはあるのですが…とてもわかりづらいです。分からない場合はALL_SIDESにしておくと全面同時に切り替わります。
uuChangeTexture()
uuChange(integer near, integer online){ if (near){ llSetTexture(default_tex, face); action = FALSE; }else if (online){ llSetTexture(online_tex, face); action = TRUE; }else{ llSetTexture(offline_tex, face); action = FALSE; } }
オーナーの状況を引数で受け取り、それぞれのテクスチャーを表示します。
uuAction()
uuAction(key id){ if (action && !waiting){ waiting = TRUE; call_person_data = "secondlife:///app/agent/" + (string)id + "/about"; llSay(0, "ただいま" + owner_name + "を呼び出しています。空いている席におかけになってお待ちください。"); llSay(0, "Now calling " + owner_name + "... Please wait."); string touched_person = llKey2Name(id); llDialog(llGetOwner(), touched_person + "さんがお見えです。" + shop_name + "にお戻りください。", ["戻った"], d_ch); llInstantMessage(llGetOwner(), touched_person + "さんがお見えです。" + shop_name + "にお戻りください。"); llInstantMessage(llGetOwner(), call_person_data); llInstantMessage(llGetOwner(), tp_pos); llSetTimerEvent(180.0); handle = llListen(d_ch, "", llGetOwner(), "戻った"); } }
タッチした人のUUIDを引数で受け取り、オーナーを呼び出します。
uuSorry()
uuSorry(){ llListenRemove(handle); llSay(0, "申し訳ありませんが、" + owner_name + "は取り込み中のようです...。後ほどIMを送ります。"); llSay(0, "Sorry... Maybe " + owner_name + " is busy..."); waiting = FALSE; llSetTimerEvent(10.0); }
3分以内にオーナーが帰って来なかった場合、この関数が呼び出され、帰ってこれない趣旨のアナウンスを行います(帰って来てから、ダイアログに表示されている「戻った」というボタンを押すことで、これを解除することができます)。