サインボード(オンラインチェッカー)

テクスチャーを準備しないといけない分、ちょっとハードルが高いかもです…。がんばってくださいませ

概要

いわゆる、オンラインだけど店を留守にしているときに、来訪者にコールしてもらうという趣旨のものです。売られているものは「オンライン / オフライン」の判定のみのものが多いですが、このスクリプトはそれに加え、「店内にいるかどうか」の判定も行います。

ここに挙げたテクスチャーはサンプル(実際にあたしが使っているもの)です。これを参考に、ご自身で作成してください

オンラインかつ店内にいるとき

わざわざオンラインであることを伝える必要がないので、お店のロゴなどを表示させておくとスマートです。この場合にクリックした人がいても、サインボードは反応しません。

オンラインだが店内にいないとき

オンラインであることを示し、クリックすることでオーナーを呼び出すことができます。オーナーには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枚

ここに挙げた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分以内にオーナーが帰って来なかった場合、この関数が呼び出され、帰ってこれない趣旨のアナウンスを行います(帰って来てから、ダイアログに表示されている「戻った」というボタンを押すことで、これを解除することができます)。

最終更新: 2010年11月08日 20 : 40 by arz Nitely
http://arzNitely.com/lsl/sample/online-checker.html

Copyright 2007-2010 ©arzNitely.com all right reserved

www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0