ソラマメブログ

2007年07月12日

リファレンス【GetG-GetL】

llGetG・・・からllGetL・・・の関数リファレンスです。
llGetGeometricCenter
llGetGMTclock
llGetInventoryCreator
llGetInventoryKey
llGetInventoryName
llGetInventoryNumber
llGetInventoryPermMask
llGetInventoryType
llGetKey
llGetLandOwnerAt
llGetLinkKey
llGetLinkName
llGetLinkNumber
llGetListEntryType
llGetListLength
llGetLocalPos
llGetLocalRot




llGetGeometricCenter

vector llGetGeometricCenter()

オブジェクトの中心点を返す。
ここで言う中心とは、オブジェクトの配置上の中心点である。
ルートプリムの座標とも重心とも異なる場合がある。

例えば同じ大きさのキューブが二つ結合されているオブジェクトであれば、llGetGeometricCenterの戻り値は二つのprimの中間地点の座標となる。

なんだか3つ以上のprimが結合された場合は微妙な結果が返るという噂もあるので、どこまで信用できるかは何ともいえない。




llGetGMTclock

float llGetGMTclock()

グリニッジ標準時(GMT)0時からの秒数を返す。

日本の標準時刻はGMT+9時間なので、
  llGetGMTclock() + 9 * 3600
とすると日本時間を計算することができる(3600 = 1時間の秒数)。

integer jp_time = llGetGMTclock() + 9 * 3600;
時:(integer)((jp_time / 3600) % 24)
分:(integer)((jp_time % 3600) / 60)
秒:(integer)(jp_time % 60)




llGetInventoryCreator

key llGetInventoryCreator(string item)

オブジェクトのコンテンツ内にあるアイテムの製作者のUUIDを得る。
調べたいアイテム名を引数itemに指定する。

指定した名前のアイテムがコンテンツ内に存在しない場合はエラーとなる。




llGetInventoryKey

key llGetInventoryKey(string name)

オブジェクトのコンテンツ内にあるアイテムのUUIDを得る。
調べたいアイテム名を引数itemに指定する。

指定した名前のアイテムがコンテンツ内に存在しない場合はNULL_KEYを返す。
また、オブジェクトのオーナーが調べたいアイテムに関して、Modify/Copy/Transfer権限を持っていない場合もNULL_KEYを返すため、この関数の戻り値がNULL_KEYだったからといって、そのアイテムがコンテンツ内に存在しないとは言えない。

コンテンツ内のアイテムの存在確認にはllGetInventoryTypeを使うこと。




llGetInventoryName

string llGetInventoryName(integer type, integer number)

コンテンツ内にある指定したtypeのnumber番目のアイテムの名前を返す。
numberはゼロから始まるアイテムの番号である。
指定したアイテムが存在しない場合は空文字""が返る。

アイテムのタイプには以下の値を使用する。
定数説明
INVENTORY_ALL -1 全種類
INVENTORY_ANIMATION 20 アニメーション
INVENTORY_BODYPART 13 ボディパーツ
INVENTORY_CLOTHING 5
INVENTORY_GESTURE 21 ジェスチャー
INVENTORY_LANDMARK 3 ランドマーク
INVENTORY_NOTECARD 7 ノートカード
INVENTORY_OBJECT 6 オブジェクト
INVENTORY_SCRIPT 10 スクリプト
INVENTORY_SOUND 1 サウンド
INVENTORY_TEXTURE 0 テクスチャ


例えば、以下の例はコンテンツに含まれる最初のスクリプト名を返す。
default {
  state_entry(){
    string script_name = llGetInventoryName(INVENTORY_SCRIPT, 0);
    if (script_name == ""){
      llSay(0, "There is no script in contents.");
    }else{
      llSay(0, "There is script '" + script_name + "'.");
    }
  }
}





llGetInventoryNumber

integer llGetInventoryNumber(integer type)

指定したtypeのアイテムがコンテンツ内にいくつあるかを返す。

アイテムのタイプには以下の値を使用する。
定数説明
INVENTORY_ALL -1 全種類
INVENTORY_ANIMATION 20 アニメーション
INVENTORY_BODYPART 13 ボディパーツ
INVENTORY_CLOTHING 5
INVENTORY_GESTURE 21 ジェスチャー
INVENTORY_LANDMARK 3 ランドマーク
INVENTORY_NOTECARD 7 ノートカード
INVENTORY_OBJECT 6 オブジェクト
INVENTORY_SCRIPT 10 スクリプト
INVENTORY_SOUND 1 サウンド
INVENTORY_TEXTURE 0 テクスチャ


例えば、以下の例はコンテンツに含まれるアイテムの数を返す。
default {
  state_entry(){
    integer item_number = llGetInventoryNumber(INVENTORY_ALL);
    if (item_number == 0){
      llSay(0, "There is no item.");
    }else{
      llSay(0, "There is " + (string)item_number + " items.");
    }
  }
}





llGetInventoryPermMask

integer llGetInventoryPermMask(string item, integer mask)

コンテンツ内にある指定したアイテム名の権限を調べる。
引数maskには調べたい権限の対象者を指定する。
定数説明
MASK_BASE 0 基本(現在のオーナーの権限に等しい)
MASK_OWNER 1 現在のオーナーの権限
MASK_GROUP 2 グループの権限
MASK_EVERYONE 3 その他の人々の権限
MASK_NEXT 4 次のオーナーの権限


戻り値はビットフィールドになっているので、以下の定数と&演算を行って権限をチェックする。
定数値(16進数)値(整数値)説明
PERM_ALL 0x7FFFFFFF 2147483647 Move/Modify/Copy/Transfer(フルパーミッション)
PERM_COPY 0x00008000 32768 Copy可能
PERM_MODIFY 0x00004000 16384 Modify可能
PERM_MOVE 0x00080000 524288 Move可能
PERM_TRANSFER 0x00002000 8192 Transfer可能


以下の例はコンテンツ内にある"hogehoge"という名前のアイテムに関して、次のオーナーがModify権限を持っているかどうかを調べる。
default {
  state_entry(){
    integer perm = llGetInventoryPermMask("hogehoge", MASK_NEXT);
    if (perm & PERM_MODIFY){
      llSay(0, "Next owner can MODIFY.");
    }else{
      llSay(0, "Next owner can't MODIFY.");
    }
  }
}





llGetInventoryType

integer llGetInventoryType(string name)

コンテンツ内にある指定した名前のアイテムのタイプを返す。
一般的に、引数nameで指定したアイテムがコンテンツ内に存在するかどうかをチェックするのに利用される。

戻り値は以下のいずれかとなる。
定数説明
INVENTORY_NONE -1 アイテムは存在しない
INVENTORY_ANIMATION 20 アニメーション
INVENTORY_BODYPART 13 ボディパーツ
INVENTORY_CLOTHING 5
INVENTORY_GESTURE 21 ジェスチャー
INVENTORY_LANDMARK 3 ランドマーク
INVENTORY_NOTECARD 7 ノートカード
INVENTORY_OBJECT 6 オブジェクト
INVENTORY_SCRIPT 10 スクリプト
INVENTORY_SOUND 1 サウンド
INVENTORY_TEXTURE 0 テクスチャ


アイテム'hogehoge'がコンテンツ内にあるかどうかを調べるには以下のようにすればよい。
default {
  state_entry(){
    if (llGetInventoryType("hogehoge") == INVENTORY_NONE){
      llSay(0, "There is not 'hogehoge'.");
    }else{
      llSay(0, "There is 'hogehoge'.");
    }
  }
}





llGetKey

key llGetKey()

オブジェクトのUUIDを返す。
あくまでも自分自身のUUIDを返すだけであり、他のオブジェクトやアバターのUUIDを調べる関数ではない。




llGetLandOwnerAt

key llGetLandOwnerAt(vector pos)

引数posで指定した位置の土地所有者のUUIDを返す。
もしもposの位置の土地がグループ所有だった場合はグループのKEYを返す。




llGetLinkKey

key llGetLinkKey(integer linknum)

linknumで示されるリンクprimのUUIDを返す。
オブジェクトが単一primの場合、linknumに指定できる有効な値は0のみである。
オブジェクトがリンクされている場合は、ルートprimのリンクナンバーは1となり、2以降は子primである。

以下の例はリンクオブジェクトにおいて、タッチされたprimのUUIDを返す。
default {
  touch_start(integer detected){
    llSay(0, "UUID of touched prim is " + (string)llGetLinkKey(llDetectedLinkNumber(0)));
  }
}





llGetLinkName

string llGetLinkName(integer linknum)

linknumで示されるリンクprimの名前を返す。
オブジェクトが単一primの場合、linknumに指定できる有効な値は0のみである。
オブジェクトがリンクされている場合は、ルートprimのリンクナンバーは1となり、2以降は子primである。

以下の例はリンクオブジェクトにおいて、タッチされたprimの名前を返す。
default {
  touch_start(integer detected){
    llSay(0, "Touched prim is " + llGetLinkName(llDetectedLinkNumber(0)));
  }
}


この関数はオブジェクト上の「ボタン」を実装する際に有用である。
タッチされたprimの「名前」に応じて処理を分岐させることでメンテナンス性の向上が見込める。
もしもタッチされたprimのリンクナンバーに応じて処理を分岐させるだけだと、オブジェクトを編集してリンクの順番が変わったときにLSLが正しく動作しなくなってしまう。
詳しい実装方法はllDetectedLinkNumberの説明を参照。




llGetLinkNumber

integer llGetLinkNumber()

自分自身のリンクナンバーを返す。
この関数が単一primで使用された場合には0、ルートprimにおいて使用された場合は1が返る。
子primにて使用された場合はそのprimのリンクナンバーが返る。

子primのリンクナンバーを調べる際に利用する関数であるが、リンクナンバーに頼った実装はオススメできない。
というのもオブジェクトが編集されるとリンクナンバーは変動する可能性があるためである。
よりメンテナンス性の高い実装については、llDetectedLinkNumber及びllGetLinkNameを参照。




llGetListEntryType

integer llGetListEntryType(list src, integer index)

リストsrcのindex番目の要素に関して、型情報を返す。

戻り値は以下の通り。
定数説明
TYPE_INTEGER 1 integer型
TYPE_FLOAT 2 float型
TYPE_STRING 3 string型
TYPE_KEY 4 key型
TYPE_VECTOR 5 vector型
TYPE_ROTATION 6 rotation型
TYPE_INVALID 0 indexがリストの範囲外


リストにリストを含めることはできないので、当然ながら戻り値にリスト型は存在しない。




llGetListLength

integer llGetListLength(list src)

リストsrcの要素数を返す。
最終インデックスの値ではないので注意。

どういうことかと言うと、
リストsrcが
  [1,2,3,4,5]
だった時、
最終インデックスの値は4である(リストの先頭はインデックス0である)。
llGetListLength関数の戻り値は要素数の5である。

言い換えるなら、インデックスの最終値は要素数-1であると言える。

この関数はリスト内の項目についてforループ等で繰り返し処理を行う際には必ずと言っていいほど登場する。
list src = [
  "one","two","three","four","five"
];

default {
  state_entry(){
    integer l = llGetListLength(src);
    integer i;
    for (i = 0; i < l; i ++){
      llSay(0, "Index:" + (string)i + "=" + llList2String(src,i));
    }
  }
}





llGetLocalPos

vector llGetLocalPos()

子primに関してルートprimからの相対位置を得る。
つまり戻り値はルートprimの中心座標からのズレを示すvector値である。

例えばルートprimのZ軸方向に1m離れた位置でリンクされた子primでは、llGetLocalPos関数は常に<0., 0.0, 1.0>を返す。
オブジェクト全体がどこに移動しようともこの戻り値は変わらない。

であるが、この関数がルートprimや単一primにおいて使用された場合、例外的にワールド座標におけるオブジェクトの位置を返す。

アタッチメントにおいても使用することができるが、アタッチメントのルートprim内でこの関数を使った場合、戻り値はアタッチメントポイントからの相対座標である。
この辺り動作が複雑なので注意すること。

llGetPosも参照。




llGetLocalRot

rotation llGetLocalRot()

子primに関してルートprimからの相対的な回転値を得る。
つまり戻り値はルートprimに対してどのくらい回転しているかを示すrotation値である。

例えばルートprimが回転ゼロのとき、90度回転してリンクされた子primでは、llGetLocalPos関数は常に90度の回転値を返す。
オブジェクト全体がどう回転しようともこの戻り値は変わらない。

であるが、この関数がルートprimや単一primにおいて使用された場合、例外的にワールド座標におけるオブジェクトの回転値を返す。

アタッチメントにおいても使用することができるが、アタッチメントのルートprim内でこの関数を使った場合、戻り値はアタッチメントポイントに対する相対的な回転値である。
この辺り動作が複雑なので注意すること。

llGetRotも参照。




タグ :GET系関数

同じカテゴリー(リファレンス)の記事
 リファレンス【M-P】 (2007-09-21 12:15)
 リファレンス【L】 (2007-08-28 13:54)
 リファレンス【GetU-K】 (2007-08-24 15:06)
 リファレンス【GetS-GetT】 (2007-08-13 13:49)
 リファレンス【GetP-GetR】 (2007-07-25 16:52)
 リファレンス【GetM-GetO】 (2007-07-14 12:15)
この記事へのコメント
Mizさん こんばんわー
毎日欠かさず拝見させてもらってます〜^^

ちょと間違いを発見しちゃいました。
llGetGMTclockの分のところで

> 分:(integer)((jp_time % 3600) / 24)

割るのは60かと〜
つまんない指摘してすみませんです。

日本語リファレンス、めちゃくちゃ活用させてもらってます。
英語のはむずかしぃ。

ではでは〜。
Posted by 河童@じょーろ at 2007年07月21日 08:05
>河童@じょーろさん

おっしゃるとおりでございます(><;
河童時間では1分=1/24時間なものでつい・・・。

人間時間に直しておきました。
Posted by Miz at 2007年07月24日 12:29
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。