SL Teleporting многопользовательская дверь? - PullRequest
2 голосов
/ 01 сентября 2009

Я пытаюсь заставить следующий скрипт работать только тогда, когда пользователь в определенной группе может телепортироваться к указанной координате 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()); 
  }
 }
}

Идеи

Ответы [ 2 ]

1 голос
/ 02 сентября 2009

Я не работал в SecondLife какое-то время, но разве цель сидя не увеличена до 10 метров? И разве люди не могут так же легко использовать сидячие цели, чтобы пройти сквозь стены и попасть в области, в которых они не должны находиться? Лучший способ сделать это - не использовать сценарии (потому что их всегда можно обойти, даже выдвинуть сценарии для обеспечения безопасности района и т. П.), А вместо этого просто использовать встроенную безопасность земли SecondLife для своего участка. Только не позволяйте никому, кроме вашей группы, получить доступ к этой посылке вообще.

Если вы действительно хотите сделать это по-своему, вам нужна функция llSameGroup. Просто убедитесь, что для вашего объекта назначена правильная группа, затем llSameGroup (идентификатор ключа) вернет, находится ли переданный идентификатор в той же группе, что и объект.

Поскольку SecondLife во многих отношениях отстой с точки зрения доступа к объектам и перехвата событий, если я правильно помню, вам сначала придется держать цель sit в неправильном месте, а затем перемещать ее в правильное место, только если сидящий пользователь находится в той же группе. В противном случае, лучшее, что вы можете сделать, это заставить пользователя сесть на него, и поскольку цель уже перемещена, к тому времени, как ваш скрипт выбьет их из вашего телепорта, они уже будут телепортироваться туда, куда вы не хотите, чтобы они двигались.

Лучшим вариантом может быть создание телепорта, который не использует сидячую цель, но фактически перемещается туда, где находится целевое местоположение. Таким образом, вы можете сделать так, чтобы он просто не двигался, если кто-то из той же группы не сидит в нем. Делать это очень просто.

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 более пары лет, поэтому, пожалуйста, дайте мне знать всем, если вы обнаружите ошибки. : -)

0 голосов
/ 12 сентября 2009

Да, кажется, где-то ошибка. Я почти уверен, что все квадратные скобки закрыты, так что это, скорее всего, в теле сценария. Я буду продолжать искать, дам вам знать, если я это укажу.

...