2009-09-01 2 views
2

J'essaie de faire que le script suivant ne fonctionne que lorsqu'un utilisateur d'un certain groupe peut se téléporter à la coordonnée x, y, z spécifiée.SL Téléportation porte multi-utilisateur?

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

Idées?

Répondre

1

Je n'ai pas travaillé dans SecondLife pendant un moment, mais je ne suis pas assis sur une cible maximisée à 10 mètres de distance, de toute façon? Et les gens ne peuvent-ils pas utiliser aussi facilement des cibles assises pour franchir des murs et pénétrer dans des zones où ils ne devraient pas être? La meilleure façon de le faire est de ne pas utiliser de scripts (car ils peuvent toujours être ignorés, même pousser des scripts pour la sécurité de zone et autres), et de simplement utiliser la sécurité intégrée de SecondLife pour votre intrigue. Ne permettez à personne, sauf à votre groupe, d'accéder à cette parcelle.

Si vous voulez vraiment faire votre chemin, la fonction que vous cherchez est llSameGroup. Assurez-vous d'affecter le groupe approprié à votre objet, puis llSameGroup (ID de clé) retournera si l'ID transmis est dans le même groupe que l'objet. Parce que SecondLife aspire à bien des égards en termes d'accès aux objets et d'événements, si je me souviens bien, vous devrez d'abord garder la cible sit au mauvais endroit, puis ne la déplacer qu'à l'emplacement correct si l'utilisateur assis est dans le même groupe. Sinon, le mieux que vous puissiez faire est de faire asseoir l'utilisateur dessus, et parce que la cible est déjà déplacée, au moment où votre script les enverra sur votre téléporteur, ils se seront déjà téléportés là où vous ne voulez pas qu'ils aillent.

Une meilleure option pourrait être de faire un téléporteur qui n'utilise pas la cible assise, mais qui se déplace réellement là où se trouve l'emplacement cible. De cette façon, vous pouvez faire en sorte qu'il ne bouge tout simplement pas, sauf si quelqu'un du même groupe est assis dedans. Faire cela est très très simple.

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!"); 
      } 
     } 
    } 
} 

Je viens d'écrire à partir de zéro que, après avoir pas joué SL pendant plus de quelques années, alors s'il vous plaît laissez-moi savoir si tout le monde vous repérer les erreurs. :-)

0

Oui, il semble y avoir une erreur quelque part. Je suis sûr que toutes les parenthèses sont fermées donc c'est probablement dans le corps du script. Je vais continuer à regarder, vous faire savoir si je le repčre.

Questions connexes