LlGetNotecardLine/ja
From Second Life Wiki
メインページ > LlGetNotecardLine > LlGetNotecardLine/ja
関数: key llGetNotecardLine( string name, integer line );
ノートカード name の line 行目の内容を dataserver イベントを介して問い合わせる。
dataserver イベントの応答に対応するハンドルのキーのkey値を返します。
| • string | name | – | a プリムのインベントリにあるnotecardあるいはUUID | |
| • integer | line | – | ノートカードでの行数 (先頭行は 0 行目です) |
line には負のインデックスを使用できません。
line がノートカードの末尾を超えている場合 dataserver イベントにて EOF が返されます。
警告
- この関数は0.1秒間、スクリプトを停止します。
- line が正常なインデックス範囲を外れていても、スクリプトはエラー表示を出さずに処理を続けます。
- プリムのインベントリからnameが無い場合、 かつ、 UUIDで指定されていない場合、 あるいは、a notecardでない場合、エラーが上でshoutされます。
- nameをUUID で指定した場合、オブジェクトに 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); } } } }
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。

