2009-09-01 2 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 미터가되는 것은 아닙니다. 그리고 사람들은 앉아있는 표적을 과거의 벽과 그들이 들어가서는 안되는 영역으로 쉽게 가져갈 수 없습니까? 이를 수행하는 가장 좋은 방법은 스크립트를 사용하지 않는 것 (지역 보안을 위해 스크립트를 푸시 (push) 할 수도 있기 때문에 항상)을 사용하지 않고 대신 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

그래, 어딘가에 오류가있는 것 같습니다. 모든 대괄호가 닫혀 스크립트의 본문에있을 가능성이 높습니다. 계속 찾아 볼게. 내가 발견하면 알려주지.