2

特定のグループのユーザーが指定された x、y、z 座標にテレポートできる場合にのみ、次のスクリプトが機能するようにしようとしています。

ソース: www.heatonresearch.com

// Scripting Recipes for Second Life
// by Jeff Heaton (Encog Dod in SL)
// ISBN: 160439000X
// Copyright 2007 by Heaton Research, Inc.
//
// This script may be freely copied and modified so long as this header
// remains unmodified.
//
// For more information about this book visit the following web site:
//
// http://www.heatonresearch.com/articles/series/22/

vector target=<190, 197, 64>;

vector offset;

default
{    
    moving_end()
    {
        offset = (target- llGetPos()) * (ZERO_ROTATION / llGetRot());
        llSitTarget(offset, ZERO_ROTATION); 
    }

    state_entry()
    {
        llSetText("Teleport pad",<0,0,0>,1.0);
        offset = (target- llGetPos()) * (ZERO_ROTATION / llGetRot());
        llSetSitText("Teleport");
        llSitTarget(offset, ZERO_ROTATION);      
    }

    changed(integer change) 
    { 
        if (change & CHANGED_LINK) 
        { 
            llSleep(0.5); 
            if (llAvatarOnSitTarget() != NULL_KEY) 
            { 
                llUnSit(llAvatarOnSitTarget()); 
            }
        }
    }

    touch_start(integer i)
    {
        llSay(0, "Please right-click and select Teleport");
    }
}
    The teleport script uses two global variables. They are.

vector target=<190, 197, 64>;
vector offset;    The target is the coordinate that the teleport script should send the user to. The offset is calculated based on the target and the current position of the teleporter. The offset is the distance that must be traveled to reach the target, starting from the teleporter.

    Whenever the teleport pad is moved, the offset must be recalculated. The sit target is then updated.

moving_end()
{
 offset = (target- llGetPos()) * 
  (ZERO_ROTATION / llGetRot());
 llSitTarget(offset, ZERO_ROTATION); 
}    Likewise, when the teleport pad is first created, the offset must be recalculated. Additionally, the sit text is specified. Rotation is also taken into account and neutralized. 

state_entry()
{
 llSetText("Teleport pad",<0,0,0>,1.0);
 offset = (target- llGetPos()) * 
  (ZERO_ROTATION / llGetRot());
 llSetSitText("Teleport");
 llSitTarget(offset, ZERO_ROTATION);      
}    When a user sits on the teleport pad, their avatar sits at the target location. The avatar is then stood up.

changed(integer change) 
{ 
 if (change & CHANGED_LINK) 
     { 
  llSleep(0.5); 
  if (llAvatarOnSitTarget() != NULL_KEY) 
  { 
   llUnSit(llAvatarOnSitTarget()); 
  }
 }
}

アイデア?

4

2 に答える 2

1

しばらく SecondLife で働いていませんが、着座ターゲットは 10 メートルの距離に最大化されていませんか? また、着座ターゲットを簡単に使用して、壁を通り過ぎて、入ってはいけない場所に入ることができないのでしょうか? これを行う最善の方法は、スクリプトを使用せず (スクリプトは常にバイパスされる可能性があり、エリア セキュリティなどのスクリプトをプッシュすることもできるため)、代わりに、SecondLife の組み込みの土地セキュリティをプロットに使用することです。あなたのグループ以外の誰もその区画にアクセスできないようにしてください。

本当に自分のやり方でやりたいのなら、探している関数は llSameGroup です。オブジェクトに適切なグループを割り当てるようにしてください。そうすれば、渡された ID がオブジェクトと同じグループにあるかどうかにかかわらず、llSameGroup(key id) が返されます。

SecondLife はオブジェクトへのアクセスとイベントのキャッチに関して多くの点でうまくいかないため、私の記憶が正しければ、最初はターゲットを間違った場所に置いておき、ユーザーが座っている場合にのみターゲットを正しい場所に移動する必要があります。同じグループで。それ以外の場合、最善の方法はユーザーをその上に座らせることです。ターゲットは既に移動しているため、スクリプトがテレポーターからターゲットをキックするまでに、移動させたくない場所に既にテレポートしています。

より良いオプションは、座るターゲットを使用しないテレポーターを作成することかもしれませんが、実際にはターゲットの場所がどこにでも移動します。そうすることで、同じグループの人が座っていないと動かないようにすることができます。それを行うことは非常に簡単です。

vector targetPos = <100,100,100>;
vector originPos;

default
{
    state_entry()
    {
        originPos = llGetPos();
    }

    changed(integer type)
    {
        if(type & CHANGED_LINK && llGetAvatarOnSitTarget() != NULL_KEY)
        {
            llSetTimerEvent(0.1);
            llWhisper(0,"Going up!");
        }
    }

    timer()
    {
        key sitter = llAvatarOnSitTarget();

        //If someone is not sitting here, go back home.
        if (sitter == NULL_KEY)
        {
            llSetPos(originPos);

            //If we've reached the origin, stop the timer.
            if (llGetPos() == originPos)
            {
                llSetTimerEvent(0.0);
            }
        }
        //If someone is sitting here, go towards the teleport.
        else
        {
            //Before we move, make sure that they're in our group.
            if (llSameGroup(sitter))
            {
                llSetPos(targetPos);
            }
            else
            {
                llUnsit(sitter);
                llWhisper(0,"Get off me, man!");
            }

            //If we've reached the target, unsit the sitter.
            if (llGetPos() == targetPos)
            {
                llUnsit(sitter);
                llWhisper(0,"We've arrived!");
            }
        }
    }
}

数年以上SLをプレイしていなかったので、最初から書いたので、間違いを見つけたらみんなに知らせてください. :-)

于 2009-09-01T20:46:42.317 に答える
0

ええ、どこかにエラーがあるようです。すべての角かっこが閉じていると確信しているので、スクリプトの本文にある可能性があります。私は探し続けます、私がそれを見つけたらあなたに知らせます。

于 2009-09-12T05:57:02.507 に答える