ソラマメ
ソラマメブログ > HOME > スクリプト > SIM横断テレポーター

SIM横断テレポーター

2013年12月12日

同様の記事をどこかで見たことある気もするのですが投稿!

■テレポーター
オブジェクトに座るとオブジェクトが所定の場所にテレポして、乗った人を下ろす。
これがよくあるテレポーターです。しかし、普通のテレポーターはSIM越えできません。
なぜなら、普通のテレポーターはllSetRegionPosという関数を使うのですが、
この関数がSIM越え出来ないからです。

ちなみに、最近llTeleportAgent()というSIM越え出来るテレポ関数ができましたが、
この関数は「オブジェクト所有者のみがテレポ対象」なので、HUDや装着して使うイメージです。
「誰でも座ったらテレポ」というタクシーみたいなテレポーターの実装には利用できません。

■じゃあSIM越えテレポするには!?
llSetRegionPos(vPos)でSIMの範囲外を指定すると、SIMの外に飛び出せる事を利用します。
SIMの範囲はvPos=<0,0,z>~<255,255,z>ですが、
vPosに<-2,-2,z>~<258,258,z>くらいまで入れても正常動作します(※)。
隣のSIMにはみ出た後、目的地にllSetRegionPos()で移動すれば、SIM越えテレポできるわけです。
※あまりでっかくはみ出ると、動きがおかしくなりました。

実験してみた感じ、2SIM間の往復はちょっとsleepを入れて移動すれば安定動作しました。
ただ、それ3SIM以上移動すると、sleepをいくらいれても不安定になりました。
テレポーターが消えたり、アバターが存在しないテレポーターに勝手に座ったりします。

■サンプル 4SIM横断テレポーター
あえて、挙動のおかしくなる4SIM横断テレポーターのサンプルを乗せますw
座ると、PrimarySIMからAkibaSIMに移動して、その後AkibaSIMからPrimarySIMに戻ってくるスクリプトです。
(①→②→③→④→③→②→①の移動をします)
SIM横断テレポーター


実行後オブジェクトの挙動がおかしくなるため、オブジェクトを llDie()して消してます。
このスクリはPrimarySIMでしか動きません。Primaryの砂場とかで遊んでください。
PrimarySIMの砂場 http://maps.secondlife.com/secondlife/Primary/40/26/22

適当なオブジェクトに以下のスクリをいれて座ると秋葉にワープします。

//
// Primary 4SIM横断テレポーター
//
// 注意
// このスクリプトはPrimary SIMでしか動作しません
// http://maps.secondlife.com/secondlife/Primary/46/24/22
// 砂場で試してみてね
//
go2Akiba(vector myPos,key uuid){
vector Akiba2Ueno=<-2,126,1000>;
vector Ueno2Nippori=<-2,126,1000>;
vector Nippori2Primary=<126,-2,1000>;
vector center=<130,124,22>;

vector Ueno2Akiba=<258,126,1000>;
vector Nippori2Ueno=<258,126,1000>;
vector Primary2Nippori=<126,258,1000>;

llSleep(1.0);

llSetRegionPos(Primary2Nippori);
llSleep(4.0);

llSetRegionPos(Nippori2Ueno);
llSleep(4.0);

llSetRegionPos(Ueno2Akiba);
llSleep(4.0);

llSetRegionPos(center);
llWhisper(0,"秋葉に到着");
llSleep(5.0);
// バグるため、立たせることが出来ない
llUnSit(uuid);
llWhisper(0,"10秒後に戻ります。");
llSleep(10.0);


llSetRegionPos(Akiba2Ueno);
llSleep(2.0);

llSetRegionPos(Ueno2Nippori);
llSleep(2.0);

llSetRegionPos(Nippori2Primary);
llSleep(2.0);
llSetRegionPos(myPos);
llSleep(4.0);
llUnSit(uuid);
llWhisper(0,"戻りました");
llDie();
}

default{
state_entry(){
llSetText("go to Akiba",<1,1,1>,1);
llOwnerSay("Hello, Avatar!");
}

changed(integer change){
if (change & CHANGED_LINK) {
// ゴミが残らないように臨時属性に変更
llSetPrimitiveParams([PRIM_TEMP_ON_REZ,1]);

llWhisper(0,"変な画面になりますが、座ったまま暫くお待ちください");

go2Akiba(llGetPos(),llAvatarOnSitTarget());
}
}
}


※ソースコードはダブルクリックすると全部選択できるよ。コピペして使ってね。


※この記事は セカンドライフ 技術系 Advent Calendar 2013 の12/12用の記事です。

Posted by uten at 23:08│Comments(0)スクリプト

同じカテゴリー(スクリプト)の記事画像
セカンドライフ内からTwitter投稿する方法
Firestorm専用のレーダースクリプト
多人数で座れる椅子の作り方
同じカテゴリー(スクリプト)の記事
 セカンドライフ内からTwitter投稿する方法 (2013-12-23 03:08)
 Firestorm専用のレーダースクリプト (2013-12-20 01:22)
 お店やカフェの利用状況を可視化するツール (2013-12-08 13:10)
 多人数で座れる椅子の作り方 (2013-04-29 19:14)
 分配機能付きチップジャーのLSL (2011-09-17 19:37)
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。