SIM横断テレポーター

uten

2013年12月12日 23:08


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

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

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

■じゃあSIM越えテレポするには!?
llSetRegionPos(vPos)でSIMの範囲外を指定すると、SIMの外に飛び出せる事を利用します。
SIMの範囲はvPos=~ですが、
vPosに~くらいまで入れても正常動作します(※)。
隣の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=;
vector Ueno2Nippori=;
vector Nippori2Primary=;
vector center=;

vector Ueno2Akiba=;
vector Nippori2Ueno=;
vector Primary2Nippori=;

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);
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用の記事です。
スクリプト