LlGetNumberOfNotecardLines/ja

From Second Life Wiki
< LlGetNumberOfNotecardLines
Revision as of 04:53, 10 April 2010 by Mako Nozaki (talk | contribs) (カテゴリ変更)
Jump to navigation Jump to search

要約

関数: key llGetNumberOfNotecardLines( string name );

dataserver イベントを通じて、ノートカード name の行数を問い合わせます。(dataserver イベントの引数を integer 型へ型キャストしてください。)
dataserver イベントの応答に対応するハンドルのキーを key で返します。

• string name プリムの インベントリ の中にあるノートカード

警告

  • この関数は 0.1 秒間、スクリプトを停止します。
  • name がプリムの中で見つからない場合、またはこれがノートカードでない場合、エラーが DEBUG_CHANNEL 上で叫ばれます。
  • name が (未保存の) 空のノートカードの場合、エラーメッセージ "Couldn't find notecard ~NAME~" (~NAME~ は name の値) が DEBUG_CHANNEL で叫ばれます。ノートカードはまだ一度も保存されていない場合、アセットとしてはまだ登録されておらず、インベントリに名前だけ出ている状態だからです。(llGetInventoryKey に渡した場合 NULL_KEY が返ります。)
  • ノートカードにインベントリのアイテム (テクスチャやランドマークといったもの) が貼り付けられていた場合は、不正確な値が返ります。

サンプル

<lsl> string NOTECARD_NAME = "config"; // 読もうとするノートカードの名前 integer notecard_line = 0; integer num_notecard_lines = 0; key notecard_request = NULL_KEY; list card_data; // ノートカードの内容

integer check_card(string name) // 指定された名前がノートカードとして在るか確認する {

   integer i = llGetInventoryType(name);
   return i == INVENTORY_NOTECARD;

}

default {

   state_entry()
   {
       state init;
   }

}

state ready {

   touch_start(integer detected)
   {
       llOwnerSay("ノートカードの内容は以下の通りです:");
       llOwnerSay(llDumpList2String(card_data, "\n"));
   }
   changed(integer change)
   {
       if (change & (CHANGED_INVENTORY)) // 誰かがノートカード内容を変更していたら、リセットする
       {
           llResetScript();
       }
   }

}

state init {

   state_entry()
   {
       if (!check_card(NOTECARD_NAME)) // ノートカードの有無を確認する
       {
           state error;
       }
       llSetText("initialising...", <1, 1, 1>, 0);
       notecard_request = NULL_KEY;
       notecard_line = 0;
       num_notecard_lines = 0;
      
       notecard_request = llGetNumberOfNotecardLines(NOTECARD_NAME); // ノートカードの行数を問い合わせる
       llSetTimerEvent(5.0); // 5 秒以内に反応が無かったら、空なのかもしれない。
   }
   timer() // 時間切れになった場合、何かがおかしい - ノートカードが空だったかもしれない。
   {
       llSetTimerEvent(0.0);
       state error;
   }
   dataserver(key query_id, string data)
   {
       // 確かに自分の問い合わせへの回答であることを確認する - これは不要なチェックであるべきだが
       if (query_id == notecard_request)
       {
           llSetTimerEvent(0.0); // 少なくとも一行以上あるので心配ない
           if (data == EOF) // ノートカードの終端まで行ったので ready ステートへ移る
           {
               state ready;
           }
           else if (num_notecard_lines == 0) // 最初に問い合わせたのは行数
           {
               num_notecard_lines = (integer)data;
               // ここで最初の行を問い合わせる
               notecard_request = llGetNotecardLine(NOTECARD_NAME, notecard_line);
           }
           else
           {
               // 空行もしくは "#" で始まる行は無視する
               if (data != "" && llGetSubString(data, 0, 0) != "#")
               {
                   card_data = (card_data = []) + card_data + data;
               }
               ++notecard_line;
               // 次の行を問い合わせる
               notecard_request = llGetNotecardLine(NOTECARD_NAME, notecard_line);
           }
       }
       // 進行状況の hover-text を更新する
       llSetText("全" + (string)num_notecard_lines + "行のうち" + (string)(notecard_line) + "行読みました。",
                 <1, 1, 1>, 1);
   }
   state_exit()
   {
       llSetText("", <0, 0, 0>, 0);
   }

}

state error {

   state_entry()
   {
       llOwnerSay("処理に失敗しました。ノートカード [ " + NOTECARD_NAME
                + " ] が存在し、何がしか内容がある事を確認してください。");
   }
   changed(integer change)
   {
       if (change & CHANGED_INVENTORY)
       {
           llResetScript();
       }
   }
}</lsl>

関連項目

イベント

•  dataserver

関数

•  llGetNotecardLine

特記事項

Search JIRA for related Issues

Signature

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