LlRequestInventoryData/ja
Jump to navigation
Jump to search
LSL ポータル | 関数 | イベント | 型 | 演算子 | 定数 | 実行制御 | スクリプトライブラリ | カテゴリ別スクリプトライブラリ | チュートリアル |
要約
関数: key llRequestInventoryData( string name );
インベントリオブジェクトにあるオブジェクトのデータを要求します。データが取得可能であれば、 dataserver イベントが発生します。
dataserver イベントが発生したときに、それを識別するキーを key で返します。
• string | name | – | プリムの インベントリ の中にあるアイテム |
インベントリのタイプ | dataserver | 説明 | ||||
---|---|---|---|---|---|---|
ランドマーク | (vector) | global_position_of_landmark = llGetRegionCorner() + (vector)data; |
警告
- この関数は 1.0 秒間、スクリプトを停止します。
- name がプリムの中で見つからない場合、エラーが DEBUG_CHANNEL 上で叫ばれます。
サンプル
//-- タッチで、オブジェクトのインベントリの最初のランドマークをオーナーの世界地図で開きます。
//-- *必ず* アタッチメントの中になければなりません。 (touch イベント以外で使用する場合の llMapDestination 要件より)
key vgKeyOwner;
default
{
touch_start( integer vIntNull )
{
if (llDetectedKey( 0 ) == vgKeyOwner)
{
integer vIntLMcount = llGetInventoryNumber( INVENTORY_LANDMARK );
//-- ランドマークがインベントリにあるか確認します
if (vIntLMcount)
{
llRequestInventoryData( llGetInventoryName( INVENTORY_LANDMARK, 0 ) );
}
}
}
dataserver( key vKeyNull, string vStrData )
{
//-- 誰がこのイベントでタッチしたのかわからないので、
//-- dataserver から呼ばれたときはオーナーに対してしか動作しません。
llMapDestination( llGetRegionName(), (vector)vStrData, ZERO_VECTOR );
}
on_rez( integer vIntNull )
{
llResetScript();
}
state_entry()
{
vgKeyOwner = llGetOwner();
}
}
//簡単に設定できるテレポータ。プリムのインベントリの中にあるランドマークから行き先を設定します。
//注意: このテレポーターは llSitTarget の制限により、距離は 300 m までです。
//by Ilse Mannonen
//ステートに入ると、インベントリデータを要求し、インベントリで最初に見つかったランドマークをテキストに設定します。
//なければ、文句を言います。
//データを取得すると、着座ポイントを設定します。
//インベントリが変更されると、スクリプトをリセットします。
//座ると、その人をテレポートして立たせます。
//Thanks to Pol Tabla, who wrote the simple sit-teleport script I have adapted here
key requestid;
default
{
state_entry()
{
//ランドマークがなければ文句を言います
if (llGetInventoryNumber(INVENTORY_LANDMARK) == 0)
{
llSay(0, "There are no landmarks in me. You need to put a landmark in me for me to work.");
}
else
{
//ランドマークの名前から、フローティングテキストを設定します
llSetText("Teleport to " + llGetInventoryName(INVENTORY_LANDMARK, 0), <1.0, 1.0, 1.0>, 1.0);
//ランドマークのデータをリクエストします
requestid = llRequestInventoryData(llGetInventoryName(INVENTORY_LANDMARK, 0));
}
}
dataserver(key id, string data)
{
if (id == requestid)
{
//データはベクトルのフォーマットになります
rotation rot = ZERO_ROTATION / llGetRot();
vector dest = (vector)data;
vector offset = (dest - llGetPos()) * rot;
llSitTarget(offset, rot);
}
}
changed(integer change)
{
if (change & CHANGED_LINK)
{ // リンクが変更されました
llSleep(0.5); // llUnSit はこの遅延でよりよく動作します
key user = llAvatarOnSitTarget();
if (user) { // 誰かが座っています
llUnSit(user); // その人を立たせます
}
}
//ビット演算を "if" で行うときは、else..if でやるよりも別々にやったほうがいいです。
//万に一つ、インベントリやリンクの変更が同じイベントで報告される場合もあるかもしれないからです。
if (change & CHANGED_INVENTORY)
{
//インベントリの変更でスクリプトをリセットします。これで、新しいランドマークを追加したときに
//みんなが手動でリセットしなくてよくなります。
llResetScript();
}
}
on_rez(integer param)
{
llResetScript();
}
}
関連項目
特記事項
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。