Site search

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

2009年2月22日日曜日

土地から追い出すスクリプト

今回は許可してないアバターをキャッチしたら、区画の外にテレポートさせるスクリプトです。簡単なセキュリティシステムって感じでしょうかね。自分の土地でのみ動作可能です。

センサーでアバターをスキャンしてllEjectFromLandで区画の外に出すようにします。
この関数は区画外にいるアバターはイジェクトできないので、センサーの検知範囲が自分の土地の区画より大きくなってしまっても大丈夫みたいですね。
ノートカードの読み出しでちょっとスクリプトが長めになってますが、特に難しい部分は無いかなって思います^^

許可するアバター名はノートに書いてコンテンツに入れてください。1行1名です。ノートカード名はテキトーな名前でOKにしました。


センサーの半径を土地の大きさに合わせて設定変えてくださいね。センサーの制限で半径は最大96mになります。あとアバターが16人以上いたら全てキャッチできないので、人の多い場所には向いてませんね^^;
// 土地の外に出す
float range=10;  // センサーの半径(m)
float time=10;  // センサーの間隔(秒)
list allow;
key owner;
string note;
integer line;
key query;
key uuid;

load()
{
    llSensorRemove();  // センサー停止
    note=llGetInventoryName(INVENTORY_NOTECARD,0);  // ノート名を取得
    line=0;
    query=llGetNotecardLine(note,line);  // ノートの読み出し開始
    uuid=llGetInventoryKey(note);  // ノートのキー取得
}

default
{
    state_entry()
    {
        owner=llGetOwner();  // オーナーのキー
        load();  // loadへ
    }

    changed(integer change)
    {
        if (change & CHANGED_INVENTORY) {  // ノートが書き換えられたらloadへ
            if (uuid != llGetInventoryKey(note) || note == "") load();
        }
    }

    sensor(integer num_detected)
    {  // センサーイベント
        key id;
        string name;
        integer i;
        integer j;
        for (i=0; i < num_detected; i++) {
            id=llDetectedKey(i);  // キャッチしたアバターのキー
            name=llDetectedName(i);  // キャッチしたアバターの名前
            if (id != owner) {  // オーナーは除く
                j=llListFindList(allow,[name]);  // リストを検索
                if (j < 0) llEjectFromLand(id);  // リストに無かったらイジェクト
            }
        }
    }

    dataserver(key query_id, string data)
    {
        if (query_id == query)
        {  // ノートを1行ずつ読み出し
            if (data != EOF) {  // ノートが終わってない
                data=llStringTrim(data,STRING_TRIM);  // 文字列の前後のスペースを除去
                if (data) {
                    allow+=[data];  // リストに加える
                    llOwnerSay(data);
                }
                line++;
                query=llGetNotecardLine(note,line);  // 次の行を読み出す
            }
            else {  // ノート読み出し終了したらセンサー開始
                llSensorRepeat("",NULL_KEY,AGENT,range,PI,time);
            }
        }
    }
}

オーナーはキーで照合するようにしてますので、ノートに名前書かなくても大丈夫です^^

0 件のコメント:

コメントを投稿