Teleport completed from http://slurl.com/secondlife/Artsebarsky/236/185/23
みたいに表示されるリンクありますよね。そのテレポート元アドレスを履歴として記録できる機能を持ったHUDか何かが、前どこかで売られてるのを見たことがあったと思うんですよ。
その時は、そういうのもあるんだって思ったんですけど、今回はそのテレポート元を記録するスクリプトを考えてみました^^
一定時間毎に現在位置をチェックするようにして、テレポートした直後にタイマーを止めてテレポート前の位置データを記録させます。ただ、これだけだとタイミングによってテレポート直後の位置データが記録されちゃうことがあるので、一時リストに何件か保存しておいて、テレポート直後のデータと比較して違ってたら履歴リストに記録するようにしました。
// テレポート元を記録
list tp; // テレポート元履歴用リスト
integer max=20; // 最大記録数
list tmp; // 現在位置一時記録用リスト
float time=1; // チェックする間隔
string get_pos()
{
vector v=llGetPos(); // 現在位置取得
// リージョン名を取得して現在位置をRegion/x/y/zにする
return llEscapeURL(llGetRegionName())+"/"+(string)((integer)v.x)+"/"+(string)((integer)v.y)+"/"+(string)((integer)v.z);
}
default
{
state_entry()
{
llSetTimerEvent(time); // タイマーをセット
}
timer()
{
tmp+=[get_pos()]; // 現在の位置データを一時的に記録
if (llGetListLength(tmp) > 10) tmp=llList2List(tmp,-10,-1); // tmpの記録数を10件に調整
}
changed(integer change)
{
if (change & CHANGED_TELEPORT)
{ // テレポートしたとき
llSetTimerEvent(0); // タイマー停止
string here=get_pos(); // 現在の位置データ取得
string str=here;
integer i;
integer j=llGetListLength(tmp);
for (i=0; here == str && i < j; i++)
{ // 現在の位置データと比較して一時記録リストからテレポート直前の位置データを取得
str=llList2String(tmp,i);
}
i=llGetListLength(tp); // 履歴リストの長さ
if (i >= max) tp=llList2List(tp,-max,-1); // 履歴リストの長さを調整
tp+=[str]; // テレポート元を履歴リストに加える
llSetTimerEvent(time); // タイマー開始
}
}
touch_start(integer total_number)
{
if (llDetectedKey(0) == llGetOwner())
{ // オーナーがタッチするとSLURLにして履歴リストを表示
integer i;
integer j=llGetListLength(tp);
llOwnerSay("** TP from location history **");
for (i=0; i < j; i++) llOwnerSay("http://slurl.com/secondlife/"+llList2String(tp,i));
}
}
}
2010年4月2日追記: ビューワー2.0.0からスペースの入ったSIM名のリンクがおかしくなるのでURLエンコード追加しました。
0 件のコメント:
コメントを投稿