自由に乗って移動できるようになってる1人用の乗り物で、それに乗ったら同じ乗り物がまた現れて、次の人が乗れるようになってる乗り物ってありますよね。それで降りたら自動的に消滅するんですよ。ジェットスキーとかで乗ったことあるんですが、バイクや車なんかもあるんでしょうかね?
今回はそんな感じで乗り捨てできる乗り物用のRezzerを書いてみました。写真の車の車内に見えてるボックスが本体です。実際はサイズを小さくして乗り物に隠れるようにしてくださいねw
まずRezzer本体のスクリプトです。乗り物をRezしたとき邪魔になるのでファントムにします。
// 乗り物Rezzer(Rezzer本体用)
integer ch=-123456; // 送受信用チャットチャンネル
rez_obj()
{
string obj=llGetInventoryName(INVENTORY_OBJECT,0); // コンテンツ内のオブジェクト
if (obj) llRezAtRoot(obj,llGetPos(),ZERO_VECTOR,llGetRot(),ch); // オブジェクトが入ってたらRez
else llWhisper(0,"I have not a vehicle."); // 入ってないときエラー表示
}
default
{
state_entry()
{
llSetStatus(STATUS_PHANTOM,TRUE); // ファントムに設定
llListen(ch,"",NULL_KEY,""); // リッスン開始
}
touch_start(integer total_number)
{
key id=llDetectedKey(0);
if (id == llGetOwner()) { // オーナーがタッチしたら
llWhisper(ch,"die"); // 既にrezされてる乗り物にdieを送信
rez_obj(); // rez_objへ
}
}
listen(integer channel, string name, key id, string msg)
{
if (channel == ch && llGetOwnerKey(id) == llGetOwner())
{ // オーナー所有物からの受信
if (msg == "rez") rez_obj(); // rezを受信したらrez_objへ
}
}
}
続いて乗り物に入れるスクリプトです。こちらも次の乗り物がRezされたら邪魔になるので、乗るまではファントムになるようにします。
// 乗り物TRezzer(乗り物用)
integer ch; // チャット用チャンネル
integer listen_handle;
default
{
state_entry()
{
llSetStatus(STATUS_PHANTOM,TRUE); // ファントムに設定
}
on_rez(integer start_param)
{ // Rezされたとき
ch=start_param; // チャットチャンネルを取得
listen_handle=llListen(ch,"",NULL_KEY,""); // リッスン開始
}
changed(integer change)
{
if (change & CHANGED_LINK) {
if (llAvatarOnSitTarget()) { // アバターが乗ったら
llSetStatus(STATUS_PHANTOM,FALSE); // ファントム解除
llListenRemove(listen_handle); // リッスン解除
llWhisper(ch,"rez"); // 次の乗り物用にrezを送信
}
else llDie(); // 乗り物から降りたら消滅
}
}
listen(integer channel, string name, key id, string msg)
{
if (channel == ch && llGetOwnerKey(id) == llGetOwner())
{
if (msg == "die") llDie(); // dieを受信したら消滅
}
}
}
このスクリプトを乗り物に追加して、Rezzerのコンテンツにその乗り物を入れます。そして、オーナーがタッチで最初の乗り物がRezされて、以後は乗る度に新しい乗り物が出てきます^^
4月18日追記: 乗り物はオーナーに限定されてない(誰でも運転可能な)ものを使ってくださいね。
0 件のコメント:
コメントを投稿