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