LlRemoteLoadScriptPin/ja

From Second Life Wiki
< LlRemoteLoadScriptPin
Revision as of 02:13, 8 October 2023 by Misaki Vanilla (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

要約

関数: llRemoteLoadScriptPin( key target, string name, integer pin, integer running, integer start_param );

スクリプト nametarget へコピーし、start_paramrunning に設定する。

• key target 同じ 地域 にある プリムUUID
• string name プリムの インベントリ の中にあるscript
• integer pin llSetRemoteScriptAccessPin によって設定された pin と値が一致しなければなりません。
• integer running スクリプトを起動状態として設定するかの boolean 値。
• integer start_param スクリプト targetllGetStartParameter を実行すると返される値。

このスクリプトの入っているオブジェクトのオーナーが target の修正権限を持っている場合に限り動作します。

警告

  • この関数は 3.0 秒間、スクリプトを停止します。
  • target が 同じ人によって所有されておらず, かつ name が謙譲不可能の場合、 DEBUG_CHANNEL でエラーが叫ばれます。
  • name がコピー可能でない場合、 エラーがDEBUG_CHANNEL 上で叫ばれます。
  • target 同じ地域でない場合、 DEBUG_CHANNEL でエラーが叫ばれます。
  • スクリプトが持ち物間でコピーまたは移動された場合、これらの State は引き継がれません。メモリやイベントキューや実行位置は全て破棄されます。
  • name がプリムの中で見つからない場合、またはこれがscriptでない場合、エラーが DEBUG_CHANNEL 上で叫ばれます。
  • nametarget のインベントリに存在している場合、警告を出すことなく置き換えます。
  • start_param の値はスクリプトがリセットされると失われます。
  • target が別のユーザに装備されたオブジェクトの場合、オブジェクトの修正権限の如何に関わらず、この関数はエラー表示を出さずに (バグ?) 失敗します。[1]
  • pin が一致しなかった場合、"Task ~Prim~ trying to illegally load script onto task ~Other_Prim~!" というエラーメッセージが DEBUG_CHANNEL で shout されます。"~Prim~" と "~Other_Prim~" はそれぞれ該当するプリム名に置き換えられます。
  • target がスクリプトの所属先である場合 (target == llGetKey()) 、"Unable to add item!" が DEBUG_CHANNEL で shout されます。
  • スクリプトの入ったオブジェクトがグループに譲渡されている場合、たとえ target が同じグループに譲渡されていても、転送される name のスクリプトに謙譲権限が必要です。
  • スクリプトが (running 、または実行中チェックボックス、または llSetScriptState で) 実行状態に設定されると、state_entry がキューに入ります。

Important Issues

~ All Issues ~ Search JIRA for related Bugs
   stack trace error while running scripts after llRemoteLoadScriptPin

サンプル

Basic Example

Pin setter

Simple script used for setting the pin for a prim, so you can later send scripts to it with llRemoteLoadScriptPin.

integer PIN=1341134;

default {
    state_entry() {
        llOwnerSay(llGetObjectName()+" : "+(string)llGetKey()+" は一致する PIN で指定されたスクリプトを受け入れる準備ができました。");
        llSetRemoteScriptAccessPin(PIN);
    }
}
Script copier
//子プリムの PIN をセットする
integer PIN=1341134;

default {
    state_entry() {
        //Remotely load the script name "some script"
        llRemoteLoadScriptPin( llGetLinkKey(2), "some script", PIN, TRUE, 0xBEEEEEEF );
    }
}

Rez and copy a file from a control object

注意: 現在、開始メッセージに署名はありません。所有者のみが確認されます。

この例では、インベントリからプリムをrezし、その中に基本的な制御ファイルを持たせ、基本的なハンドシェイクを行ってピンを設定し、スクリプトを転送します。

転送が完了したら、rezしたプリム内のヘルパースクリプトは自動的に削除されます。

Control prim
integer controlchan = 0;
integer controlid = -1;
start()
{
    llSetTimerEvent(0);
    talkingto = NULL_KEY;
    integer a = (integer)llFrand(43);
    controlchan = a * a;
    controlchan -= controlchan * 3;
    controlid = llListen(controlchan,"","","set-connect");
    llRezObject("card",llGetPos()+<0,0,0.1>,<0,0,0>,ZERO_ROTATION,a);
    llSetTimerEvent(60);
}
key talkingto = NULL_KEY;
integer busy = FALSE;
integer accesspin = 0;
default
{
    timer()
    {
        llSetTimerEvent(0);
        llOwnerSay("Lost connection!");
        llListenRemove(controlid);
        busy = FALSE;
    }
    listen(integer chan,string name,key id,string message)
    {
        if(chan == controlchan)
        {
            if(llGetOwnerKey(id) == llGetOwner())
            {
                if(talkingto == NULL_KEY)
                {
                    if(message == "set-connect")
                    {
                        llSetTimerEvent(0);
                        talkingto = id;
                        llListenRemove(controlid);
                        controlid = llListen(controlchan,"",talkingto,"ready");
                        llRegionSayTo(id,controlchan,"auto-connect");
                        llSetTimerEvent(60);
                    }
                }   
                else if(id == talkingto)
                {
                    if(message == "ready")
                    {
                        llSetTimerEvent(0);
                        accesspin = (integer)llFrand(2345)+213;
                        llListenRemove(controlid);
                        controlid = llListen(controlchan,"",talkingto,"pinset");
                        llSleep(1);
                        llRegionSayTo(talkingto,controlchan,(string)accesspin);
                        llSetTimerEvent(60);
                    }
                    else if(message == "pinset")
                    {
                        llSetTimerEvent(0);
                        llListenRemove(controlid);
                        llRemoteLoadScriptPin(talkingto,"demo.lsl",accesspin,1,0);
                        llSleep(3);
                        llRegionSayTo(talkingto,controlchan,"finished");
                        llOwnerSay("Transfer of file finished - control file should have auto deleted itself!");
                        busy = FALSE;
                    }
                } 
            }   
        }
    }
    touch_end(integer a)
    {
        if(busy == FALSE)
        {
            busy = TRUE;
            if(llGetOwner() == llDetectedKey(0))
            {
                start();
            }
        }
    }
}
rezzed prim
integer listen_id = -1;
integer listen_chan = -1;
key details_from = NULL_KEY;
default
{
    on_rez(integer a)
    {
        if(a == 0)
        {
            llOwnerSay("- Direct rez -");
        }
        else
        {
            llOwnerSay("- Awaiting config connection -");
            listen_chan = a * a;
            listen_chan -= listen_chan * 3;
            listen_id = llListen(listen_chan,"","","auto-connect");
            llWhisper(listen_chan,"set-connect");
            llSetTimerEvent(30);
        }
    }
    timer()
    {
        llOwnerSay("Failed to connect to rezzer deleting myself!");
        llSetTimerEvent(0);
        llDie();
    }
    listen(integer chan,string name,key id,string message)
    {
        if(llGetOwnerKey(id) == llGetOwner())
        {
            if(message == "auto-connect")
            {
                llSetTimerEvent(0);
                llListenRemove(listen_id);
                listen_id = llListen(listen_chan,"",id,"");
                llRegionSayTo(id,listen_chan,"ready");
                details_from = id;
                llSetTimerEvent(30);                 
            }
            else if(details_from != NULL_KEY)
            {
                llSetTimerEvent(0);  
                if(message == "finished")
                {
                    llSetRemoteScriptAccessPin((integer)message);
                    llRemoveInventory(llGetScriptName());         
                }
                else
                {
                    llSetRemoteScriptAccessPin((integer)message);
                    llRegionSayTo(id,listen_chan,"pinset");
                } 
                llSetTimerEvent(30);  
            }
        }
    }
}

関連項目

関数

•  llSetRemoteScriptAccessPin 送り先プリムの準備に使う
•  llSetScriptState スクリプトの起動状態を設定する
•  llResetOtherScript プリムの他のスクリプトをリセットする

特記事項

経緯

  • 1.2.6 で追加
  • SL 1.25.4 でこの関数はスクリプトがフルパーミッションでない限り、アタッチメントの中のスクリプトをコピー・移動しなくなった。(SVC-3725)
  • SL 1.25.5 でこの関数は、送り先がコピーと謙譲権限をもつ (もしくはもっと限定された) 場合に限り、アタッチメントの中のスクリプトをコピー・移動できるようになった。(SVC-3738)

All Issues

~ Search JIRA for related Issues
   stack trace error while running scripts after llRemoteLoadScriptPin

脚注

  1. ^ 装備したオブジェクトはそのオーナーだけが修正できます。

Signature

function void llRemoteLoadScriptPin( key target, string name, integer pin, integer running, integer start_param );
この翻訳は 原文 と比べて古いですか?間違いがありますか?読みにくいですか?みんなで 修正 していきましょう! (手順はこちら)
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。