LlGetNotecardLine/ja - Second Life Wiki

LlGetNotecardLine/ja

From Second Life Wiki

メインページ > LlGetNotecardLine > LlGetNotecardLine/ja
Jump to: navigation, search

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

ノートカード nameline 行目の内容を dataserver イベントを介して問い合わせる。

dataserver イベントの応答に対応するハンドルのキーのkey値を返します。

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

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

警告

  • この関数は0.1秒間、スクリプトを停止します。
  • line が正常なインデックス範囲を外れていても、スクリプトはエラー表示を出さずに処理を続けます。
  • プリムのインベントリからnameが無い場合、 かつ、 UUIDで指定されていない場合、 あるいは、a notecardでない場合、エラーが上でshoutされます。
  • nameUUID で指定した場合、オブジェクトに asset permissionsが追加されずに済みます。
    • プリムのインベントリに内に置いた場合、その使用制限が当該オブジェクトにも引き継がれてしまいます
  • name が (未保存の) 空のノートカードの場合、エラーメッセージ "Couldn't find notecard ~NAME~" (~NAME~ は name の値) が DEBUG_CHANNEL で shout されます。ノートカードはまだ一度も保存されていない場合、資産としてはまだ登録されておらず、インベントリに名前だけ出ている状態だからです。(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 {
 
                // data にはノートカードの行内容が入っている
                llSay(0, "Line " + (string)iLine + ": " + data);
 
                // 次の行を問い合わせる
                iLine++;   // 行カウンタを増やす
                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 変数へ読み込んだので、必要な文字列操作を開始できます。
        // ここでは読んだ内容をループを使って出力します。
 
        // 変数宣言は一度で済ませます。ループの中で宣言するとラグの原因になります。
        integer end = llGetListLength(gOneCard);
        integer i = 0;
        for (; i< end; ++i)
            llSay(0, llList2String(gOneCard,i));
        end = llGetListLength(gTwoCard);
        for (i = 0; i< end; ++i)
            llSay(0, llList2String(gTwoCard,i));
        end = llGetListLength(gThreeCard);
        for (i = 0; i< end; ++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
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。