ソラマメブログ

2007年07月25日

リファレンス【GetP-GetR】

llGetP・・・からllGetR・・・の関数リファレンスです。
llGetParcelDetails
llGetParcelFlags
llGetParcelMaxPrims
llGetParcelPrimCount
llGetParcelPrimOwners
llGetPermissions
llGetPermissionsKey
llGetPos
llGetPrimitiveParams
llGetRegionCorner
llGetRegionFlags
llGetRegionFPS
llGetRegionName
llGetRegionTimeDilation
llGetRootPosition
llGetRootRotation
llGetRot




llGetParcelDetails

list llGetParcelDetails(vector pos, list details)

posで示される位置の土地の情報を得る。
得られる情報は名称、説明、オーナーUUID、グループUUID、面積の5つ。
引数detailsには以下の値をリストにして指定する。
定数名意味文字長戻り値の型
PARCEL_DETAILS_NAME 0 土地の名称63string
PARCEL_DETAILS_DESC 1 土地の説明127string
PARCEL_DETAILS_OWNER 2 土地オーナーのUUID(36) key
PARCEL_DETAILS_GROUP 3 土地グループのUUID(36) key
PARCEL_DETAILS_AREA 4 面積(sqm)(5) integer


以下の例は現在位置の土地名と面積を表示する。
default{
  state_entry(){
    list ret = llGetParcelDetails(llGetPos(), [
      PARCEL_DETAILS_NAME,
      PARCEL_DETAILS_DESC,
      PARCEL_DETAILS_OWNER,
      PARCEL_DETAILS_GROUP,
      PARCEL_DETAILS_AREA
    ]);

    string ParcelName = llList2String(ret, 0);
    string ParcelDesc = llList2String(ret, 1);
    key ParcelOwner = llList2Key(ret, 2);
    key ParcelGroup = llList2Key(ret, 3);
    integer ParcelArea = llList2Integer(ret, 4);

    llSay(0,"Parcel:" + ParcelName + "(" + (string)ParcelArea + "sqm)");
  }
}





llGetParcelFlags

integer llGetParcelFlags(vector pos)

posで示される位置の土地の設定内容を得る。
設定内容とは「飛行可」「プッシュ可」等の土地ごとに設定されているルールのことを指す。

戻り値は以下の値を含むビットフィールドである。
定数名値(16進数)値(10進数)説明
PARCEL_FLAG_ALLOW_FLY 0x1 1 飛行許可
PARCEL_FLAG_ALLOW_SCRIPTS 0x2 2 スクリプト許可
PARCEL_FLAG_ALLOW_LANDMARK 0x8 8 ランドマーク作成許可
PARCEL_FLAG_ALLOW_TERRAFORM 0x10 16 土地編集許可
PARCEL_FLAG_ALLOW_DAMAGE 0x20 32 ダメージ有効
PARCEL_FLAG_ALLOW_CREATE_OBJECTS 0x40 64 ビルド許可
PARCEL_FLAG_USE_ACCESS_GROUP 0x100 256 グループメンバーのみ立ち入り可
PARCEL_FLAG_USE_ACCESS_LIST 0x200 512 アクセスリスト記載者のみ立ち入り可
PARCEL_FLAG_USE_BAN_LIST 0x400 1024 バンリスト有効
PARCEL_FLAG_USE_LAND_PASS_LIST 0x800 2048 パスリスト有効
PARCEL_FLAG_LOCAL_SOUND_ONLY 0x8000 32768
PARCEL_FLAG_RESTRICT_PUSHOBJECT 0x200000 2097152 プッシュ禁止
PARCEL_FLAG_ALLOW_ALL_OBJECT_ENTRY 0x8000000 134217728 オブジェクトrez許可
PARCEL_FLAG_ALLOW_GROUP_OBJECT_ENTRY 0x10000000 268435456 グループのみrez許可
PARCEL_FLAG_ALLOW_GROUP_SCRIPTS 0x02000000 268435456 グループのみスクリプト許可
PARCEL_FLAG_ALLOW_CREATE_GROUP_OBJECTS 0x04000000 268435456 グループのみビルド許可
定数不明 0x20000000 268435456 ボイスチャット有効


例えば以下のコードは現在位置が飛行可能かどうかを判定する。
default{
  touch_start(integer detected){
    integer flags = llGetParcelFlags(llGetPos ());
    if (PARCEL_FLAG_ALLOW_FLY & flags){
      llOwnerSay ("You can fly!");
    }else{
      llOwnerSay ("You can't fly...");
    }
  }
}





llGetParcelMaxPrims

integer llGetParcelMaxPrims(vector pos, integer sim_wide)

引数posで指定された位置の土地のprim限界数を得る。
引数sim_wideにTRUEを指定するとSIMのprim限界数、FALSEの場合は分割管理された土地の限界数を得ることができる。




llGetParcelPrimCount

integer llGetParcelPrimCount(vector pos, integer category, integer sim_wide)

引数posで指定された位置の土地に存在するprimの数を得る。
土地オーナーのprim数、グループのprim数など、引数categoryを指定することで種別ごとのカウントが可能。
引数sim_wideにTRUEを指定するとSIM全体のprim数、FALSEの場合は分割管理された土地に存在するprim数を得ることができる。

引数categoryには以下の値を指定可能である。
定数名説明
PARCEL_COUNT_TOTAL 0全てのprimの数(ただしtempオブジェクトはカウントされない)
PARCEL_COUNT_OWNER 1土地オーナー所有のprimの数
PARCEL_COUNT_GROUP 2土地グループ所有のprimの数
PARCEL_COUNT_OTHER 3オーナー以外が所有しているprimの数
PARCEL_COUNT_SELECTED 4選択中または座っているprimの数
PARCEL_COUNT_TEMP 5tempオブジェクトのprim数





llGetParcelPrimOwners

list llGetParcelPrimOwners(vector pos)

引数posで指定された位置の土地に存在するprimのオーナーUUID及び所有prim数のリストを得る。
リストは以下の形式で返される。
  [key owner1, integer prim_count1, key owner2, integer prim_count2, .....]
オーナーのUUIDと所有数が繰り返し並んでいる形である。

なおリストに返るオーナーは100人までらしいので、土地上に100人以上の異なるオーナーのprimがあった場合は全員の情報を得られないようだ。
そんな物凄い状況の土地に縁がないため本当かどうかはわからないが(^^;




llGetPermissions

integer llGetPermissions()

現在取得しているパーミッションを得る。
戻り値はビットフィールドになっているので以下の定数を使って&演算を行い、必要なパーミッションが取得されているかどうかをチェックする。
定数名説明対応する関数
PERMISSION_DEBIT L$の支払い権限llGiveMoney
PERMISSION_TAKE_CONTROLS キー操作取得の権限llTakeControls、llReleaseControls
PERMISSION_TRIGGER_ANIMATION アニメーション実行権限llStartAnimation、llStopAnimation
PERMISSION_ATTACH アタッチ制御権限llAttachToAvatar、llDetachFromAvatar
PERMISSION_CHANGE_LINKS リンク制御権限llCreateLink、llBreakLink、llBreakAllLinks
PERMISSION_TRACK_CAMERA カメラ位置取得権限llGetCameraPos、llGetCameraRot
PERMISSION_CONTROL_CAMERA カメラ制御権限llSetCameraParams、llClearCameraParams


上記「対応する関数」に記載されている関数を使用する際には該当するパーミッションを取得しなければならない。
例えばllGiveMoney関数を使用する際には、以下のようにしてパーミッションを確認する。
integer start_animation(string animetion_name){
  integer perm = llGetPermissions();
  if (perm & PERMISSION_TRIGGER_ANIMATION) {
    llStartAnimation(animetion_name);
    return TRUE;
  }
  return FALSE;
}


パーミッションを取得するにはllRequestPermissions関数を使用する。
誰に対するパーミッションを取得しているかはllGetPermissionsKey関数を使用して確認する。




llGetPermissionsKey

key llGetPermissionsKey()

現在取得しているパーミッションの対象者UUIDを返す。
戻り値は誰に対するパーミッションを取得しているかを示すUUIDである。

llGetPermissions関数を使用すると現在取得しているパーミッションを得ることができるが、例えばアニメーション実行権限を得ているからと言って、その権限が誰に対して有効なのかはわからない。
パーミッションは直前に呼び出されたllRequestPermissions関数で指定したアバターに対しての権限である。

例えばタッチしたときにアニメーションを実行するような仕組みを考えたとき、アニメーションのパーミッションが正しく取得されているかどうかを調べるには、タッチした人に対するパーミッションを保持しているかどうか以下のようにして判定する。
default {
  touch_start(integer detected){
    if (llGetPermissionsKey() == llDetectedKey(0)){
  integer perm = llGetPermissions();
  if (perm & PERMISSION_TRIGGER_ANIMATION) {
    llStartAnimation("hogehoge");
  }
    }
  }
}


パーミッションがない場合はllRequestPermissions関数を使用して取得しなければならない。




llGetPos

vector llGetPos()

primの現在位置を返す。
戻り値はSIM上の座標を示すvector値である。

この関数がリンクオブジェクトの子primで使用された場合、戻り値はその子primのワールド座標である。
ルートの位置ではないので注意。

ルートprimに対する子primの相対座標を取得したい場合はllGetLocalPos関数を使用する。
子prim内のLSLからルートprimの座標を取得したい場合はllGetRootPosition関数を使用する。

なお、アタッチメントにおいてこの関数が使用された場合は、primの位置ではなく、アバターの位置を返す。

default {
  touch_start(integer detected) {
    llSay(0, "Positin:" + (string)llGetPos());
  }
}





llGetPrimitiveParams

list llGetPrimitiveParams(list params)

primの属性値を返す。
引数paramsには取得したい属性のリストを指定する。
戻り値は引数に指定した属性に応じたリスト型のデータとなる。

基本的に、buildツールを使って指定可能なprimの設定値は全てこの関数を使用して取得できる。
また、この関数の戻り値を使ってllSetPrimitiveParams関数を実行すると、buildツールと同様にprimを編集することが可能である。
これはつまりbuildの自動化が実現できることを意味する。
鏡面コピースクリプトなどは、この関数を使ってコピー元のprimの属性値を取得し、必要なパラメータに鏡面変換をかけた後、llSetPrimitiveParams関数でコピー後のprimを形成する。

引数には以下のようなリストを指定する。
引数説明戻り値
[PRIM_BUMP_SHINY, integer face]face面のバンプマップとシャイニングの設定を得る[integer shiny, integer bump]
[PRIM_COLOR, integer face]face面の色と透明度を得る[vector color, float alpha]
[PRIM_FLEXIBLE]フレキシブルの設定値を得る[integer TRUE/FALSE, integer softness, float gravity, float friction, float wind, float tension, vector force]
[PRIM_FULLBRIGHT, integer face]face面のフルブライト設定を得る[integer TRUE/FALSE]
[PRIM_MATERIAL]マテリアル設定を得る[integer material]
[PRIM_PHANTOM]ファントムかどうかを得る[integer TRUE/FALSE]
[PRIM_PHYSICS]物理オブジェクトかどうかを得る[integer TRUE/FALSE]
[PRIM_POINT_LIGHT]ライトの設定値を得る[integer TRUE/FALSE, vector color, float intensity, float radius, float falloff]
[PRIM_POSITION]位置を得る[vector position]
[PRIM_ROTATION]回転を得る[rotation rot]
[PRIM_SIZE]サイズを得る[vector size]
[PRIM_TEMP_ON_REZ]tempオブジェクトかどうかを得る[integer TRUE/FALSE]
[PRIM_TYPE]primの基本設定値を得る[integer primtype,...prim計上によって戻り値リストの配列は異なる]
[PRIM_TEXGEN, integer face]face面のテクスチャマッピングモードを得る[integer texgen]
[PRIM_TEXTURE, integer face]face面のテクスチャ情報を得る[( string name OR key uuid ), vector repeats, vector offsets, float rotation]

各属性値の詳しい内容についてはllSetPrimitiveParams関数の説明を参照。

引数には複数のパラメータの組み合わせを指定することが可能である。

例えば、物理属性とtemp属性、さらにファントム属性をまとめて確認したい場合は、引数リストに
  [PRIM_PHYSICS,PRIM_TEMP_ON_REZ,PRIM_PHANTOM]
を指定する。
default {
  touch_start(integer detected){
    list p = llGetPrimitiveParams([PRIM_PHYSICS,PRIM_TEMP_ON_REZ,PRIM_PHANTOM]);
    string msg;
    if (llList2Integer(p,0)){
      msg = "PHYSICS:ON / ";
    }else{
      msg = "PHYSICS:OFF / ";
    }
    if (llList2Integer(p,1)){
      msg = "TEMP:ON / ";
    }else{
      msg = "TEMP:OFF / ";
    }
    if (llList2Integer(p,2)){
      msg = "PHANTOM:ON";
    }else{
      msg = "PHANTOM:OFF";
    }
    llSay(0, msg);
  }
}





llGetRegionCorner

vector llGetRegionCorner()

グローバル座標におけるSIMの南西隅の座標を返す。

グローバル座標系とは全SIMが展開されている座標系のこと。
通常オブジェクトの位置指定などにはSIM内の座標が使用されるが、このllGetRegionCorner関数の戻り値+SIM内の座標を使用するとグローバル座標系における位置を扱うことができる。

SIMを越えて運行する乗り物などを作る際にはグローバル座標系を利用した位置管理が有用になるだろう(やったことないです。っていうかSIM複数なんて自由に扱える立場にありませんw)。




llGetRegionFlags

integer llGetRegionFlags()

SIMの設定内容を得る。
設定内容とは「太陽の位置固定」とか「サンドボックス」等のSIMごとに設定されているルールのことを指す。

戻り値は以下の値を含むビットフィールドである。
定数名値(16進数)値(10進数)説明
REGION_FLAG_ALLOW_DAMAGE 0x1 1 ダメージ有効
REGION_FLAG_FIXED_SUN 0x10 16 太陽の位置固定
REGION_FLAG_BLOCK_TERRAFORM 0x40 64 地形編集不可
REGION_FLAG_SANDBOX 0x100 256 サンドボックス
REGION_FLAG_DISABLE_COLLISIONS 0x1000 4096 衝突判定無効
REGION_FLAG_DISABLE_PHYSICS 0x4000 16384 物理オブジェクト無効
REGION_FLAG_BLOCK_FLY 0x80000 524288 飛行禁止
REGION_FLAG_ALLOW_DIRECT_TELEPORT 0x100000 1048576 テレポート可
REGION_FLAG_RESTRICT_PUSHOBJECT 0x400000 4194304 プッシュ禁止


SIM全体ではなく個々の土地の設定内容を調べるにはllGetParcelFlags関数を使う。




llGetRegionFPS

float llGetRegionFPS()

SIMのFPSを返す。
FPSとはFrames per Secondの略で、1秒間に処理されるフレーム数のことである。
数字が高いほど高速に処理されていることになる(最高で45FPSらしい)。

FPSが低いということは、1秒間あたりの処理量が少ないということであるから、SLの動作が遅くなると考えてよい。
タッチしてもオブジェクトがすぐには反応しない等、いわゆる「ラグい」状態のときにはFPSが低くなっている可能性が高い。

例えば、FPSが一定値以下になったら動作を止めるような仕組みを実装しておくと、ラグいときには無駄な負荷をかけない賢いオブジェクトが作れたりもする。

ただし、あらゆるラグの原因が全てサーバーの処理能力が低下しているためというわけではない。
FPSが高いにも関わらずラグいようなときには、ネットワーク負荷など、別の要因が考えられる。




llGetRegionName

string llGetRegionName()

SIMの名前を返す。
名前以外の情報(SIMが上がっているかどうかとか)を得る場合はllRequestSimulatorData関数を使用する。




llGetRegionTimeDilation

float llGetRegionTimeDilation()

SIMの処理速度を判断するためのパーセンテージを返す。
戻り値は0.0~1.0の小数である。

1.0は処理遅延が発生していないことを示す。
0.0であれば完全に処理が止まっている(この関数自体返ってこない気がするw)。
0.5とかなら、通常の半分程度の戦闘力しか発揮していない状態ということになる。

llGetRegionFPS関数とともに、SIMの稼働状況を確認するために使われる関数である。




llGetRootPosition

vector llGetRootPosition()

ルートprimの位置を返す。
アタッチメントで使用された場合はアバターの位置を返す。




llGetRootRotation

rotation llGetRootRotation()

ルートprimの回転値を返す。




llGetRot

rotation llGetRot()

primの回転値を返す。
アタッチメントで使用された場合はアバターの回転を返す。
アタッチ位置に対する相対的な回転を得たい場合はllGetLocalRotを使用する。





タグ :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)
 リファレンス【GetM-GetO】 (2007-07-14 12:15)
 リファレンス【GetG-GetL】 (2007-07-12 12:15)
この記事へのコメント
最近、セカンドライフをはじめさせていただいたので、制作活動もはじめました。今日、ハイヒールを作ったのですが、人間の皮膚をかすめてしまいます。見本にした、ハイヒールには、invisibleの名前で、何かスクリプトが入っているようです。ヒールの部分に透明のテキスチャーを貼り付けて、ほぼ完成しているのですが。。。アバターの皮膚より優先してオブジェクトが見えるスクリプトがあるのでしょうか?
Posted by Miyu jacobus at 2007年07月26日 16:24
>Miyu jacobusさん

えと、それは俗にインビジプリムと言って、「プリム内部のものを不可視にする」プリムです。
その正体はあるテクスチャを特定のオフセット値で貼り付けたものです。
ハイヒールに入っているというinvisibleの名前のスクリプトは、特定のテクスチャを貼り付けるためのスクリプトだと思います。
言い換えるなら「インビジプリム」を作り出すためのスクリプトです。

アバターの体が見えなくなるのはスクリプトの直接的な機能ではありません。
特殊な透明テクスチャを利用し、言わば「3Dグラフィックの盲点」を突くようにして内部のものを不可視にしています。
あくまでもテクスチャを使った「トリック」です。

私はインビジプリムを利用してモノ作りをしたことがないので、あまり具体的なアドバイスができず申し訳ありませんが・・・。
tinyアバターを作っている方やカツラ屋さん、あるいはハイヒール職人さんなら普段利用することが多いので詳しいことをご存知かと思います。
フリーで入手可能なインビジプリムもありますので、「インビジプリム」あたりのキーワードでググってみると良いですよ(^^
Posted by Miz at 2007年07月26日 21:34
いつも参考にさせていただいています。
SLは4月から始めて、スクリプトは6月くらいから始めました。
最初の取っ掛かりの所で、分かり易く解説してくれる資料がなくて、足踏みしていたのですが、
このサイトを見つけて、ようやく始めることが出来ました。
噛み砕いた説明で、経験の無い自分にも本当に分かり易くて助かっています。
書き込み量もハンパじゃなく、いつも凄いなと思ってます。
お世話になりっ放しですが、これからも頑張ってください!
Posted by 独楽 at 2007年08月09日 12:38
スクリプトを書くときはいつも参考にさせて頂いてます!

llGetParcelFlags ですが、2つほど不足の定数を見つけたので、
報告させて頂きます。

PARCEL_FLAG_ALLOW_GROUP_SCRIPTS (0x02000000)
PARCEL_FLAG_ALLOW_CREATE_GROUP_OBJECTS (0x04000000)


あと、定数は用意されていないようですが、
SL内で試してみたところ、
ボイスチャットのフラグも取得できました。

値は、0x20000000 です。
Posted by natsu at 2007年08月15日 18:33
>natsuさん

ご指摘ありがとうございます。
遅くなりましたが修正しておきました(^^
Posted by MizMiz at 2007年08月20日 14:30
Mizさん、本当にありがとうございました^^ コメントが大変おそくなってしまいもうしわけございませんでした。おかげさまで、制作活動が順調に進み、SLを満喫できています
改めてありがとうございましたぁ^^
Posted by Miyu JacubusMiyu Jacubus at 2007年08月31日 04:15
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。