ソラマメブログ

2007年08月13日

リファレンス【GetS-GetT】

llGetS・・・からllGetT・・・の関数リファレンスです。
llGetScale
llGetScriptName
llGetScriptState
llGetSimulatorHostname
llGetStartParameter
llGetStatus
llGetSubString
llGetSunDirection
llGetTexture
llGetTextureOffset
llGetTextureRot
llGetTextureScale
llGetTime
llGetTimeOfDay
llGetTimestamp
llGetTorque




llGetScale

vector llGetScale()

primのサイズを返す。
戻り値のvectorはprimのX,Y,Zのサイズを意味する。
単位はメートル。




llGetScriptName

string llGetScriptName()

現在実行中のスクリプト名を返す。
しばしば自動消滅ロジックを実装する際に利用する。

以下のコードは開始後30秒でスクリプトを自動消滅させる。
敵に秘密を知られたくない場合はこのような自爆装置を組み込むとMIっぽい。
default {
  state_entry(){
    llSetTimerEvent(30.0);
  }

  timer(){
    llRemoveInventory(llGetScriptName());
  }
}





llGetScriptState

integer llGetScriptState(string name)

引数nameに指定したスクリプトが稼働中なのか、それとも停止中なのかを判定する。
nameに指定するのはオブジェクトのコンテンツ内にある名前でなければならない。

戻り値がTRUEだった場合は、スクリプトは生きている。
FALSEだった場合は死んでいる。

死んでるスクリプトはllResetOtherScript関数などを使って蘇らせることが可能である。




llGetSimulatorHostname

string llGetSimulatorHostname()

SIMが稼動しているサーバーのホスト名を返す。
対象となるSIMは現在オブジェクトが存在しているSIMである。

ホスト名とは要するにサーバーの名前だと考えて良い。
名前がわかったら攻撃できるとか、陰陽師みたいなことを言い出してはいけない。




llGetStartParameter

integer llGetStartParameter()

スクリプトのスタートパラメータを返す。
スタートパラメータとはllRezObject関数やllRemoteLoadScriptPin関数で指定された整数値のことである。
on_rezイベントに渡される引数と同値。

通常の方法で(単純に保存した、インベントリからオブジェクトにドロップした等)スクリプトが開始されたときにはスタートパラメータはゼロである。
また、llRezObject関数などでスタートパラメータが指定されていた場合でも、スクリプトがリセットされるとスタートパラメータはゼロに戻る。




llGetStatus

integer llGetStatus(integer status)

引数statusに指定したオブジェクトの属性がONかOFFかを判定する。
引数に指定可能な定数値は以下の通り。

定数初期値説明
STATUS_BLOCK_GRAB 64FALSE 重力遮断。この属性がTRUEの場合、オブジェクトは重力の影響を受けていない。
STATUS_DIE_AT_EDGE 128FALSE ワールド外生存不可。この属性がTRUEの場合、オブジェクトはワールドの境界を越えた時点で消滅する。
STATUS_PHANTOM 16FALSE ファントム。幻影。オブジェクトがファントムの場合はTRUEが返る。
STATUS_PHYSICS 1FALSE 物理。オブジェクトが物理オブジェクトの場合はTRUEが返る。
STATUS_RETURN_AT_EDGE 256 FALSE この属性がTRUEの場合、オブジェクトはワールドの境界を越えた時点でリターンされる。
STATUS_ROTATE_X 2TRUE この属性がFALSEの場合、オブジェクトはローカルX軸の周囲を回転しない。
STATUS_ROTATE_Y 4TRUE この属性がFALSEの場合、オブジェクトはローカルY軸の周囲を回転しない。
STATUS_ROTATE_Z 8TRUE この属性がFALSEの場合、オブジェクトはローカルZ軸の周囲を回転しない。
STATUS_SANDBOX 32FALSE サンドボックス。この属性がTRUEの場合、オブジェクトは他の土地に移動不能なだけでなく、初期位置から10m以上動くことができない。



例えば、以下のようにしてオブジェクトが物理かどうかを判定することができる。
default {
  state_entry(){
    if (llGetStatus(STATUS_PHYSICS)){
      llSay(0, "PHYSICS ON.");
    }else{
      llSay(0, "PHYSICS OFF.");
    }
  }
}


これらの属性をセットするにはllSetStatus関数を使う。



llGetSubString

string llGetSubString(string source, integer start, integer end)

文字列sourceのstart文字目からend文字目までの文字列を返す。
例えば"ABCDEFG"という文字列があったとき、startに2、endに4を指定すると、2番目~4番目の文字列"CDE"を返す。
llGetSubString("ABCDEFG", 2, 4) → "CDE"
文字列の先頭文字は0番目となるので注意すること。

startまたはendにマイナスの数値を指定した場合、「後ろから数えた位置」になる。
例えば-1であれば、後ろから1番目、すなわち最後の文字である。
従って、startが0、endが-1だった場合は最初から最後の文字全てが返る。
llGetSubString("ABCDEFG", 0, -1) → "ABCDEFG"

さらにややこしい話だが、startにendよりも大きい値を指定した場合、start以上、end以下の文字列が返る。
llGetSubString("ABCDEFG", 4, 1) → "ABEFG"

llGetSubString関数は引数に指定した文字列を変更するわけではない。
あくまでも元の文字列はそのままにして、結果を返すだけである。
元の文字列を変更したい場合は、llGetSubString関数の結果を元の変数に代入する必要がある。
src = llGetSubString(src, 3, 6);
このようにすると、変数srcに3番目~6番目の文字列が入る。




llGetSunDirection

vector llGetSunDirection()

太陽の位置を示す単位ベクトルを得る。
この関数はSL内で見かけ上の「昼」か「夜」かを判定するのに利用される。

すなわち、llGetSunDirection関数の戻り値のZ値(垂直方向)が、
・プラスであれば太陽は地平線よりも「上」=「昼」
・マイナスであれば太陽は地平線よりも「下」=「夜」
と判断できる。

この関数の戻り値は、クライアントから変更可能な太陽位置とは無関係である。
たとえクライアント側で太陽の位置を「真昼」に設定していたとしても、実際にはSIMでは太陽が沈んでいるかもしれない。
関数の戻り値は実際の太陽の位置のほうである。

以下の例は夜か昼かを太陽の位置で判断する。
default {
  touch_start(integer detected){
    vector sun = llGetSunDirection();
    if (sun.z > 0.0){
      llSay(0, "Daytime.");
    }else{
      llSay(0, "Nighttime.");
    }
  }
}





llGetTexture

string llGetTexture(integer side)

引数sideで指定した面のテクスチャを返す。
テクスチャがオブジェクトのコンテンツ内にある場合は名前が返るが、そうではない場合はUUIDが返る。

なお、この関数でテクスチャを取得するにはmodify権限が必要。

テクスチャをセットするにはllSetTexture関数を使う。




llGetTextureOffset

vector llGetTextureOffset(integer side)

引数sideで指定した面のテクスチャオフセットを返す。
戻り値のvectorのX・Yは、horizontal・verticalのオフセット値を意味する。

通常オフセット値は-1.0~1.0の間である。

オフセットを設定するにはllOffsetTexture関数を使う。




llGetTextureRot

float llGetTextureRot(integer side)

引数sideで指定した面のテクスチャ回転値(ラジアン)を返す。

逆にテクスチャの回転を設定するにはllRotateTexture関数を使用する。




llGetTextureScale

vector llGetTextureScale(integer side)

引数sideで指定した面のテクスチャサイズを返す。
戻り値のvectorのX・Yは、テクスチャのXサイズ・Yサイズを意味する。

テクスチャサイズをセットするにはllScaleTexture関数を使う。




llGetTime

float llGetTime()

スクリプトが最後にリセットされてからの秒数、もしくは前にllResetTime関数やllGetAndResetTime関数を実行したときからの秒数を返す。
要するにスクリプトの稼動秒数を取得するための関数であると考えれば良い。
時刻や日付を取得する関数ではないので注意。




llGetTimeOfDay

float llGetTimeOfDay()

SIMがリブートされてからの秒数、もしくはSIMの真夜中(太陽が真裏を通過した瞬間)からの経過秒数を返す。
通常、SIMの太陽は4時間周期で一周するため、llGetTimeOfDay関数の戻り値は14,400を越えることはない。
ただし、SIMによっては太陽を固定している場合がある。
太陽が固定されている場合、SIMの真夜中の概念が消失するため、llGetTimeOfDay関数の戻り値はリセットされない(SIMがリブートされない限り、どんどん増加していく)。

リブートされてからの時間か、または真夜中からの時間のどちらか一方に統一してくれれば使いやすいのだが・・・どちらの秒数が返るかはSIMのリブート状況次第であるので、イマイチ使いにくい関数である。




llGetTimestamp

string llGetTimestamp()

現在時刻を返す。
形式は"YYYY-MM-DDThh:mm:ss.ff..fZ"である。
例えば"2007-08-12T13:16:21.785886Z"のようになる。




llGetTorque

vector llGetTorque()

トルクを得る。
トルクというのはオブジェクトの物理回転力のことである。

物理オブジェクトの「フォース」と言うと永続的なオブジェクトの運動力を指すが、フォースは直線的な力である。
トルクは同様に永続的な運動力だが、回転を与える力である。

llGetForce関数やllSetTorque関数も参照のこと。






タグ :GET系関数

同じカテゴリー(リファレンス)の記事
 リファレンス【M-P】 (2007-09-21 12:15)
 リファレンス【L】 (2007-08-28 13:54)
 リファレンス【GetU-K】 (2007-08-24 15:06)
 リファレンス【GetP-GetR】 (2007-07-25 16:52)
 リファレンス【GetM-GetO】 (2007-07-14 12:15)
 リファレンス【GetG-GetL】 (2007-07-12 12:15)
この記事へのコメント
 初めまして。
 最近SLでスクリプトを書き始め、いろいろと調べているうちにここにたどり着きました。

 さて、テクスチャ関係のリファレンスがあるので、ここで質問させていただきます。
 今作っているスクリプトなのですが、「誰でもテクスチャを貼ることができるボードで、インベントリにあるテクスチャをスライドショウする」というものを作っています。

 最初にオブジェクトのcontentsに登録しておいたものはスライドショウできるのですが、スクリプト実行中にテクスチャをドロップしても表示されません。
 デバッグの為にchanged内(change & CHANGED_INVENTORYでインベントリの変更はチェックしている)でtimerを止めてインベントリの数と名前を表示させたりしているのですが、ドロップしたテクスチャがありませんでした。
 オブジェクトの表示はドロップしたテクスチャが表示された状態になっています。
 このテクスチャは、オブジェクトのどこにあるのでしょうか?テクスチャをドロップしただけではインベントリに入らないのでしょうか?
 もしくはインベントリに登録処理が必要なのでしょうか?

 お忙しいとは思いますがご教授いただければと思いコメントさせていただきました。
Posted by sasapy at 2007年08月17日 13:27
 結局、なんとか解決しました。

1.テクスチャをドロップした面を見ていなかった
 元々の表示がALL_SIDESで表示していたので、ドロップしてもALL_SIDESだと思っていたら、ドロップした面でllGetTextureしなければなかった。

2.ドロップしたテクスチャはどこにあるのか?
 llGetTextureで取得できたのはドロップしたテクスチャの(string)keyでした。keyからllKey2Nameしても名前は""でした。
 llSetTextureは(string)keyでも表示できるので、そのままkeyを保存してスライドショウの次回以降に表示可能となりました。
 しかし、物がどこにあるのか分からないということは解決できていません。ownerがある部分をtouchするとリセットする仕掛けにしていたので、llResetScriptで無くなってもかまわないのでよしとしています。
 ちなみにNortcardは、ちゃんとcontentsに入ったので、テクスチャは何かが違うということなんでしょう。

ということで、なんとか出来そうです。
Posted by sasapy at 2007年08月19日 19:30
>sasapyさん

レス遅くなりました、すみません(><;

そうですね、テクスチャをドロップして貼った場合は特定の面だけに貼られますので、取得する際には面の指定が必須です。

ドロップしたテクスチャは、オブジェクト側には存在しません。
あくまでもドロップした人のインベントリ内に残ります。
オブジェクトのコンテンツ内にテクスチャを保持したい場合は、llAllowInventoryDrop関数を使ってオブジェクトのコンテンツへのアイテムドロップを許可し、テクスチャをコンテンツ内にドロップしてもらうようにするしかないですねぇ。

>Nortcardは、ちゃんとcontentsに入ったので

そう言われるとそうですね・・・。
アニメーションとかサウンドなどはどうなるんでしょうねぇ~。
Posted by MizMiz at 2007年08月20日 16:58
Mizさん
 こんにちは。

 実は state_entry() の一番最初で llAllowInventoryDrop(TRUE); は実行してます。
 ドロップする側はボード上(薄っぺらいBoxプリム)にテクスチャをドロップするようにしてるのですが、ドロップする側がcontentsフォルダを意識するような物ではないので、このボード自体のインベントリには入らないままとなりますね。
 たぶん実用に影響は無いので、これでよしとしました。

 オブジェクトの形式によって処理を分けなければならないとなると、あとあと物作りをするときに面倒なことになりそうです。

 単純な疑問ですが、ドロップした人が違うSIMに移動してしまったらどうなるんでしょうね。誰かに協力してもらって実験してみます。

 コメントをいただきありがとうございました。
Posted by sasapy at 2007年08月20日 19:01
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。