LlGetNumberOfNotecardLines/ja

From Second Life Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

要約

関数: 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 が返ります。)
  • ノートカードにインベントリのアイテム (テクスチャやランドマークといったもの) が貼り付けられていた場合は、不正確な値が返ります。
All Issues ~ Search JIRA for related Bugs

サンプル

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();
        }
    }
}

関連項目

イベント

•  dataserver

関数

•  llGetNotecardLine

特記事項

Search JIRA for related Issues

Signature

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