2009年01月14日
テレポーター用スクリプト(短距離用)
あけましておめでとうございます。
年が明けて早2週間になりますけど、いまだに正月ボケが続いてます

本年もできる限りブログを更新していきますので、よろしくお願いしますm(_ _)m
さて、回転の話は、あともう少し続きがあるんですけど、新年1発目ですので
あんまし激しい内容もどうかなと ・・・^^;;
というわけで、
コピペ用のスクリプトを載せることにしますね

今回は、テレポーター(短距離用)のスクリプトです。
地図を開いて他のSIMへテレポートするヤツじゃなくて、
お家とかお店とかの1Fから2Fへ みたいな感じで、すぐ近くにテレポートするヤツです。
これもあちこちで見かけるスクリプトなんですけどね、いろいろと面倒な制限があるものが多いんですよ^^;
というわけで、使い勝手がいいように細かいところを改良してみました

【使い方】
(手順1) テレポーターとして使うオブジェクトを作る。
(手順2) コンテンツの中に下記のスクリプトを入れる。数値等の設定はお好みに書き換えてください。
(スクリプトの入れ方)
右クリック→編集→コンテンツ→新しいスクリプト→右クリックで開く→下のスクリプトをコピペ
→数値等の設定→保存→Save completeと表示されればOK
以下、コピペしてお使いください
vector destination = <125 , 98 , 23> ; // ①テレポート先の座標 |
default |
{ |
state_entry() |
{ |
string sit_text = "あの世へ" ; // ②目的地などパイメニューの表示文字 |
llSetSitText ( sit_text ) ; |
destination -= llGetPos() ; |
rotation q = llGetRot() ; |
llSitTarget ( destination / q , ZERO_ROTATION / q ) ; |
llRotTarget ( q * <1,0,0,0> , PI ) ; |
llRotTarget ( q * <0,1,0,0> , PI ) ; |
llRotTarget ( q * <0,0,1,0> , PI ) ; |
} |
changed(integer chan) |
{ |
key av = llAvatarOnSitTarget() ; |
if( chan & CHANGED_LINK && av != NULL_KEY ) { |
llUnSit (av) ; |
} |
} |
moving_end() |
{ |
llResetScript() ; |
} |
at_rot_target ( integer tnum , rotation targetrot , rotation ourrot ) |
{ |
llResetScript() ; |
} |
} |
おしまいです(^_^)v
【設定項目】
設定する必要があるのは、①、②の2項目です。赤い部分を変更してください。
①テレポート先の座標
テレポート先の絶対座標をベクトル形式で記入してください。ツールバーの上に表示されている、あの数値です。
ただし、テレポートできる距離に制限がありまして、300m以内の移動にしか使えないです。
さらには、SIMをまたいでテレポートすることもできないです。
まぁ、同じ建物内で他の階へテレポートするような使い方なら問題ないんでしょうけど、
例えば、1000m上空のスカイボックスにテレポートするとか、隣のSIMにテレポートするといった場合には、
これとは別のスクリプトが必要になってきます。
それはまた機会があれば^^
で、テレポート先の座標は、テレポーターに対する相対座標で設定することもできます。
相対座標っていうのは、テレポーターよりも 何m東、何m北、何m上 といった感じの座標です。
テレポーターを備え付けた家とかを販売する場合には、買った人によって設置する場所が違ってくるでしょうから
こっちの相対座標で設定しておかなきゃですよね。
これもベクトル形式で記入するんですけど、< 東西方向 , 南北方向 , 上下方向 > という感じです。
それぞれ東向き、北向き、上向きが正の値です。
で、そんな感じで①に相対座標を書き込んだあと、スクリプト中にある緑色の一行
destination -= llGetPos() ;
を消しちゃってください。それでOKです

②パイメニューの表示文字
この部分を設定すると、パイメニューを開いたときに表示される文字を変更することができます。
公式ビューアーでは日本語入力が可能です。
【スクリプトに関する小ネタ】
えと、スクリプターの方が対象になりますけど、ちょっと便利な(?) 技を思いついたので、
よろしければ試してみてください^^
って、既に知ってらっしゃったらゴメンナサイ

ご存じの通り、このテレポーターは、テレポート先を llSitTarget で指定しておいて、アバターが座ったらすぐに
llUnSit で立たせる仕組みのヤツです。
でもこれって、オブジェクトの位置や角度を変えちゃうと、はじめに設定した位置・角度と違うところに座ることに
なっちゃいますよね^^;;
だから、位置や角度が変わる度にスクリプトをリセットする必要があるんですけど・・・・・・
位置の方は、moving_endイベントを使うだけなので簡単なんですよ。
問題は、角度の方なんでして^^;;
オブジェクトの角度の変化が直接トリガーになるイベントってないみたいですねぇ

困ったことにwikiにも
There is no way to trigger on a rotation directly. To do so, you'll need to use a timer
って書いてます(>_<)
でも、まさかこれだけのために わざわざタイマーを使うわけにもいかないでしょう

う~~ん、角度に関するイベントって、at_rot_target と not_at_rot_target しかないですしね~~
なんとかならないかなぁ~~~
って感じで、いろいろと考えた結果!!!ババーーン

state_entryの中に
llRotTarget ( llGetRot() * <1,0,0,0> , PI ) ; // x軸回転
llRotTarget ( llGetRot() * <0,1,0,0> , PI ) ; // y軸回転
llRotTarget ( llGetRot() * <0,0,1,0> , PI ) ; // z軸回転
のように、RotTargetを3つ設定しておけば、
at_rot_target イベントで、あらゆる角度の変化を感知することができますです!!!にゃははは
もっといい方法が他にあるかもですけどね^^;;
ではでは~~
