LlGetNumberOfNotecardLines/ja
< LlGetNumberOfNotecardLines
Jump to navigation
Jump to search
Revision as of 03:04, 12 April 2010 by Mako Nozaki (talk | contribs) (Undo revision 849612 by Mako Nozaki (Talk))
LSL ポータル | 関数 | イベント | 型 | 演算子 | 定数 | 実行制御 | スクリプトライブラリ | カテゴリ別スクリプトライブラリ | チュートリアル |
要約
関数: 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>
関連項目
特記事項
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。