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に戻ってくるスクリプトです。
(①→②→③→④→③→②→①の移動をします)

実行後オブジェクトの挙動がおかしくなるため、オブジェクトを llDie()して消してます。
このスクリはPrimarySIMでしか動きません。Primaryの砂場とかで遊んでください。
PrimarySIMの砂場 http://maps.secondlife.com/secondlife/Primary/40/26/22
適当なオブジェクトに以下のスクリをいれて座ると秋葉にワープします。
※ソースコードはダブルクリックすると全部選択できるよ。コピペして使ってね。
※この記事は セカンドライフ 技術系 Advent Calendar 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に戻ってくるスクリプトです。
(①→②→③→④→③→②→①の移動をします)

実行後オブジェクトの挙動がおかしくなるため、オブジェクトを 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)
│スクリプト