2010年8月11日水曜日

スクリプト禁止領域でも動くスクリプト

今回はスクリプトを禁止されてる場所でも動くスクリプトです。装着するものに使います^^

仕組みはスクリプトがllTakeControlsでコントロールを取得すると、スクリプト禁止場所でも動くようになるので、それを利用するって感じですね。(禁止してる場所に行く前に装着する必要があります)

今回のサンプルは現在位置の座標を表示するHUDのスクリプトをスクリプト禁止の場所でも動くように改造してみました。乗り物とかみたいなコントロールイベントは不要なのでありません。
// 現在位置の座標を表示(スクリプト禁止領域でも動作)

string get_pos(string s)
{
    vector pos=llGetPos();  // 現在位置取得
    // 値を整数にして文字列に変換
    string x=(string)((integer)pos.x);
    string y=(string)((integer)pos.y);
    string z=(string)((integer)pos.z);
    return x+s+y+s+z;  // 引数sで区切ってリターン
}

init()
{
    llRequestPermissions(llGetOwner(),PERMISSION_TAKE_CONTROLS);  // コントロールの権限をリクエスト
}

default
{
    state_entry()
    {
        if (llGetAttached()) init();  // 装着されてたらinit実行
        llSetTimerEvent(0.1);  // 最初は0.1後にタイマー開始
    }

    attach(key id)
    {
        if (id) init();  // 装着されたらinitへ
    }

    run_time_permissions(integer perm)
    {
        if (perm & PERMISSION_TAKE_CONTROLS)
        {
            llTakeControls(-1,FALSE,FALSE);  // スクリプト禁止領域でも動作させる
        }
    }

    timer()
    {
        llSetTimerEvent(1);  // 1秒おきにタイマーをセット
        string str=llGetRegionName()+"\n("+get_pos(", ")+")";  // SIM名と座標を表示用に整形
        llSetText(str,<1,1,1>,1.0);  // フローティングテキストに表示
    }

    touch_start(integer total_number)
    {
        if (llDetectedKey(0) == llGetOwner()) {  // オーナーがタッチしたらSLURLをチャット
            llOwnerSay("http://slurl.com/secondlife/"+llEscapeURL(llGetRegionName())+"/"+get_pos("/"));
        }
    }
}

最近ビューワー2が何かイヤになってきたので、SLURLはビューワー1用のslurl.comに変えてます。これのほうが互換あっていいと思うしw

でもスクリプトを改造するんだったら、llTakeControlsの注意点に書かれてるように、同じプリムに入ってるスクリプトには効果があるので、下記のように「禁止領域でも動作する部分」だけ独立させて、他のスクリプトと同じプリムに入れたほうが簡単でいいかもですねw
// 同じプリム内のスクリプトをスクリプト禁止領域でも動作させる

init()
{
    llRequestPermissions(llGetOwner(),PERMISSION_TAKE_CONTROLS);  // コントロールの権限をリクエスト
}

default
{
    state_entry()
    {
        if (llGetAttached()) init();  // 装着されてたらinit実行
    }

    attach(key id)
    {
        if (id) init();  // 装着されたらinitへ
    }

    run_time_permissions(integer perm)
    {
        if (perm & PERMISSION_TAKE_CONTROLS)
        {
            llTakeControls(-1,FALSE,FALSE);  // スクリプト禁止領域でも動作させる
        }
    }
}

llTakeControlsのCONTROLフラグの値は、何となく使われてない値にしようと思ったんですが、0にしたらエラー出たので-1にしました。(別に使われてる値でも問題ないですけど)

0 件のコメント:

コメントを投稿