LlGetNumberOfNotecardLines/ja
< LlGetNumberOfNotecardLines
Jump to navigation
Jump to search
Revision as of 05:32, 25 February 2016 by SakuraNoel Fayray (talk | contribs)
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 が返ります。)
- ノートカードにインベントリのアイテム (テクスチャやランドマークといったもの) が貼り付けられていた場合は、不正確な値が返ります。
サンプル
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 Wikiの関連した項目が参考になるかもしれません。