LlGetNotecardLine/ja

From Second Life Wiki
Jump to navigation Jump to search

要約

関数: key llGetNotecardLine( string name, integer line );

ノートカード nameline 行目の内容を dataserver イベントを介して問い合わせる。
dataserver イベントの応答に対応するハンドルのキーを key で返します。

• string name プリムの インベントリ の中にあるノートカードまたは UUID
• integer line ノートカードでの行数 (先頭行は 0 行目です)

line には 負のインデックス を使用できません。 line がノートカードの末尾を超えている場合 dataserver イベントにて EOF が返されます。

警告

  • この関数は 0.1 秒間、スクリプトを停止します。
  • line が正常なインデックス範囲を外れていても、スクリプトはエラー表示を出さずに処理を続けます。
  • name がプリムの中で見つからない場合、かつこれが UUID でない場合、またはこれがノートカードでない場合、エラーが DEBUG_CHANNEL 上で叫ばれます。
  • nameUUID である場合、オブジェクト自体に新たな アセット権限 が発生するようなことはありません。
    • アセットをプリムのインベントリの中に置いた場合、これまで発生していた使用制限は新しいオブジェクトで新たに作成されません。
  • name が (未保存の) 空のノートカードの場合、エラーメッセージ "Couldn't find notecard ~NAME~" (~NAME~ は name の値) が DEBUG_CHANNEL で叫ばれます。ノートカードはまだ一度も保存されていない場合、アセットとしてはまだ登録されておらず、インベントリに名前だけ出ている状態だからです。(llGetInventoryKey に渡した場合 NULL_KEY が返ります。)
  • ノートカードにインベントリのアイテム (テクスチャやランドマークといったもの) が貼り付けられていた場合は、何行目を問い合わせようとも EOF が返ります。
  • 問い合わされた行の長さが 255 バイトを超えた場合、dataserver イベントには先頭の 255 バイトだけ渡されます。

サンプル

key kQuery;
integer iLine = 0;
default {
    
    state_entry() {
        llSay(0, "Reading notecard...");
        // 可能ならば "My Notecard" を読む
        kQuery = llGetNotecardLine("My Notecard", iLine);
    }

    dataserver(key query_id, string data) {

        if (query_id == kQuery) {    // 確かに "My Notecard" の処理という事でよいか?
            // 対象となるノートカードの行
            if (data == EOF) {    

                llSay(0, "ノートカードの末尾です。" + (string)iLine + " 行読みました。");

            } else {
                
                llSay(0, "Line " + (string)iLine + ": " + data);   // data はノートカードの現在の行の内容をもつ
                
                //request next line
                iLine++;   // increment line count
                kQuery = llGetNotecardLine("My Notecard", iLine);   // 可能なら他の行を読む

            }
        }
    }
}

便利なスニペット

/////
//  Generic Multi Notecard reader by Brangus Weir
//  Given freely and published on wiki.secondlife.com
//
//  三個のノートカードを読み、結果を三個の list 変数へ格納します。
//  ノートカードの個数は、必要に応じて変更できます。
//


list gOneCard;    // 一番目のノートカードの全ての行
list gTwoCard;    // 二番目のノートカードの全ての行
list gThreeCard;  // 三番目のノートカードの全ての行

string gsCardOneName = "One";  // 実際のノートカード名に置き換えてください
string gsCardTwoName = "Two";
string gsCardThreeName = "Three";

// 処理用のテンポラリ変数
string g_sNoteCardName; // 読むノートカードの名前
list g_lTempLines;      // list 変数へ追加するデータ
integer g_iLine;        // 問い合わせに使う行カウンタ
key g_kQuery;           // 問い合わせに使うキー


initialize(string _action) {
    // dataserver を用いる際の実行順により、この関数は最初のノードから読み始め、
    // 再度呼ばれたときに _action が "finish" だった場合は実行を終了します。
    if (_action == "") {
        loadNoteCard(gsCardOneName);
    } else if (_action == "finish") {
        // 全てのノートカードを list 変数へ読み込みました...
        // これでなんらかの文字列操作を行い、スクリプトに設定するのに必要なデータを取得することができます。
        // しかしここではループを使ってカードが読み込まれたことを証明します。

        g_lTempLines = []; // このグローバル変数を削除するのを忘れないで。重くなってしまいます。

        integer len = llGetListLength(gOneCard);  //これは必ず 1 回のみ算出してください。
                                                  //初心者君みたいに
                                                  //for ループの中でやるようなことがないように。
                                                  //ラグを減らして、マシンサイクルに気を遣おう!
        integer i = 0;
        for (; i< len; ++i)
            llSay(0, llList2String(gOneCard,i));

        len = llGetListLength(gTwoCard);
        for (i = 0; i< len; ++i)
            llSay(0, llList2String(gTwoCard,i));

        len = llGetListLength(gThreeCard);
        for (i = 0; i< len; ++i)
            llSay(0, llList2String(gThreeCard,i));
    }                
                              
}

loadNoteCard( string _notecard ) {
    g_lTempLines = []; // 処理用のテンポラリ変数を空にします
    g_sNoteCardName = _notecard;
    g_iLine = 0;
    g_kQuery = llGetNotecardLine(g_sNoteCardName, g_iLine);  
    
}

notecardFinished(string _notecard){
    // 各々のノートカードが読み終わった際に呼ばれます。テンポラリ変数内容が
    // 本来の list 変数へ移され、次のノードカード読み込みに移ります。
    if (_notecard == gsCardOneName) {
        gOneCard = g_lTempLines;
        loadNoteCard(gsCardTwoName);
    } else if (_notecard == gsCardTwoName) {
        gTwoCard = g_lTempLines;
        loadNoteCard(gsCardThreeName);
    } else if (_notecard == gsCardThreeName) {
        gThreeCard = g_lTempLines;
        initialize("finish");  // 読み込みが終わった旨を伝える
    }
}

default
{
    state_entry()
    {
    }
    
    touch_start(integer _num_det){
        initialize("");
    }
     
    dataserver(key _query_id, string _data) 
    {
        if (_query_id == g_kQuery) {
            // ノートカードの行
            if (_data != EOF) {
                g_lTempLines += [_data];
                //次の行を問い合わせる
                g_iLine++;  // 行カウンタを増やす
                g_kQuery = llGetNotecardLine(g_sNoteCardName, g_iLine);
            } else {
                // ノートカードを末尾まで読み終わったので、その旨を伝える
                notecardFinished(g_sNoteCardName);
            }
        }
    }
}

注意点

処理対象のノートカードは modify あるいは no modify/no copy でも構いません。

関連項目

イベント

•  dataserver

関数

•  llGetNumberOfNotecardLines

特記事項

Search JIRA for related Issues

Signature

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