まず、自分(オブジェクト)の inventory にアクセスする方法ですが、llGetInventoryNumber() と llGetInventoryName() という関数で、すべての、あるいは notecard など特定のタイプの inventory の数と、名前を得ることができます。
また、notecard に記述されている内容にアクセスするには、llGetNumberOfNotecardLines() で行数を得て、llGetNotecardLine() で、それぞれの行のテキストを得ることができます。ただし、これらは直接、結果を返す
これらの関数を応用したスクリプトで、Touch されたら、inventory にある最初の notecard の内容を、instant message で owner に送ります。
string notecardName; integer notecardSize; integer notecardRead; list notecardLines; key owner; key notecardRequest; setNotecard() { notecardName = llGetInventoryName(INVENTORY_NOTECARD, 0); } printNotecardName() { llInstantMessage(owner, "notecardName=\"" + notecardName + "\""); } printNotecardLines() { string s = ""; s += "\n---BEGIN OF NOTECARD ---"; integer i = 0; for ( ; i < notecardSize; i++) { s += ("\n" + llList2String(notecardLines, i)); } s += "\n--- END OF NOTECARD ---"; llInstantMessage(owner, s); } default { state_entry() { setNotecard(); owner = llGetOwner(); llSetTouchText("Read Notecard"); printNotecardName(); } changed(integer change) { if (change & CHANGED_INVENTORY) { setNotecard(); printNotecardName(); } } touch_start(integer total_number) { integer i = 0; for ( ; i < total_number ; i++) { key avator = llDetectedKey(i); if (avator == owner) { if (notecardName == "") { llInstantMessage(owner, "no notecard in my inventory"); } else { notecardSize = -1; notecardRequest = llGetNumberOfNotecardLines(notecardName); } } } } dataserver(key query, string data) { if (query == notecardRequest) { if (notecardSize < 0) { notecardSize = (integer)data; if (notecardSize <= 0) { llInstantMessage(owner, "The notecard \"" + notecardName + "\" is empty."); } else { llInstantMessage(owner, (string)notecardSize + " lines" + " in the notecard \"" + notecardName + "\"."); notecardRead = 0; notecardLines = []; notecardRequest = llGetNotecardLine(notecardName, 0); } } else { notecardRead ++; notecardLines += data; if (notecardRead < notecardSize) { notecardRequest = llGetNotecardLine(notecardName, notecardRead); } else { printNotecardLines(); } } } } } |
Notecard の内容を保持するのに、list 型を使ってみました。また、途中で、inventory に変更があり、例えば、最初は notecard がなくても、途中で、追加された場合でも対応できるように、changed() イベントを実装してあります。また、status の外に、user defined の関数を定義しておきました。
[10:10] Notecard example: notecardName="sample text" [10:11] Notecard example: 3 lines in the notecard "sample text". [10:11] Notecard example: ---BEGIN OF NOTECARD --- This is the first line. This is the second line. これは、3行目です。 --- END OF NOTECARD --- |
この例のように、ASCII 以外の、例えば日本語の文字もきちんとサポートされています。
Tags: programming, second_life