LlRequestInventoryData/ja

From Second Life Wiki
< LlRequestInventoryData
Revision as of 05:33, 25 February 2016 by SakuraNoel Fayray (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

要約

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

関連項目

イベント

•  dataserver

関数

•  llMapDestination

特記事項

Search JIRA for related Issues

Signature

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