2009-09-01 3 views
2

私は、特定のグループのユーザーが指定されたx、y、z座標にテレポートすることができる場合にのみ、以下のスクリプトを実行しようとしています。SLテレポートマルチユーザドア?

出典: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()); 
    } 
} 
} 

のアイデア?

答えて

1

私はSecondLifeでしばらく働いていませんが、座っている目標が最大10メートルの距離になっていません。そして、人々は、過去の壁や、取り囲まないはずの領域を得るために座っているターゲットを簡単に使用することはできませんか?これを行う最善の方法は、スクリプトを使用することではなく(常にバイパスすることができ、地域のセキュリティなどのスクリプトをプッシュすることもできます)、代わりにSecondLifeの組み込みの土地セキュリティをプロットに使用することです。あなたのグループ以外の誰もそのパーセルにアクセスすることを許可しないでください。

本当にあなたが探している機能は、llSameGroupです。あなたのオブジェクトに適切なグループを割り当てていることを確認したら、llSameGroup(key id)は渡された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を2年以上プレイしていない状態で、最初から書きましたので、間違いを見つけたら誰にでも教えてください。 :-)

0

はい、どこかにエラーがあるようです。すべての角括弧が閉じられているので、スクリプトの本体にある可能性が高いと思います。私は見続けるだろう、私はそれを見つけるかどうかを知らせる。

関連する問題