Difference between revisions of "User:Daemonika Nightfire/Scripts/Access Tutorial EN"

From Second Life Wiki
Jump to navigation Jump to search
(create english version and begin translate)
 
(→‎Owner: translation)
Line 91: Line 91:
|-
|-
|}
|}
  Einen Gegenbeweis mittels 'else if' kann man sich eigentlich sparen, wenn nur der Besitzer das Script verwenden darf.
  A reverse proof with 'else if' are not needed if you just want to use it for owner only.
  Das erspart dir nicht nur unnoetige Arbeit, sondern spart auch Speicher (memory) fuer wichtigere Funktionen.
  That will save work and save memory for more important funktions.
  Ausser du moechtest unterschiedliche Funktionen fuer unterschiedliche User, dann musst du natuerlich wie in den oberen Beispielen unterscheiden.
  Except you want different functions for different users, then you have different course as in the above examples.
<lsl>
<lsl>
     touch_start(integer num_detected)
     touch_start(integer num_detected)
Line 100: Line 100:
         if(Avatar == owner) // detected Key == (equal) Owner
         if(Avatar == owner) // detected Key == (equal) Owner
         {
         {
             llSay(0, "Du bist der Besitzer.");
             llSay(0, "You are the Owner.");
         }
         }
     }
     }
</lsl>
</lsl>


==Group / Gruppe==
==Group / Gruppe==

Revision as of 00:57, 19 November 2012

General Permissions

The first 4 examples works in all events where you can use llDetectedKey(0) to get the AvatarKey (UUID). For easy understand i just show it with the touch event and for comparisation deeper with the listener event, because there are llDetectedKey(0) impossible.

Public

This easy example are the same like a "New Script" which everyone can create in a simple prim. It has no restrictions and can used by everyone. <lsl> default {

   state_entry()
   {
       
   }
   touch_start(integer total_number)
   {
       llSay(0, "Touched.");
   }
   
   on_rez(integer Dae)
   {
       llResetScript();
   }

} </lsl>


Owner

The following script are a bit different. If someone click, it will check that the Avatar who clicked it is realy the owner. <lsl> key owner; // global variable for store the OwnerKey.

default {

   state_entry()
   {
       owner = llGetOwner(); // store the OwnerKey (UUID)
   }
   touch_start(integer num_detected)
   {
       if(llDetectedKey(0) == owner) // detected Key == (equal) Owner
       {
           llSay(0, "Touched.");
       }
       else if(llDetectedKey(0) != owner) // detected Key != (not equal) Owner
       {
           llSay(0,"You are not the Owner.");
       }
   }
   
   on_rez(integer Dae)
   {
       llResetScript();
   }

} </lsl> The following alternative examples needs the global stored vatiable 'owner' otherwise it must replaced with llGetOwner().

Alternative Methode 1 Alternative Methode 2
<lsl>
   touch_start(integer num_detected)
   {
       key Avatar = llDetectedKey(0);
       if(Avatar == owner) // detected Key == (equal) Owner
       {
           llSay(0, "You are the Owner.");
       }
       else if(Avatar != owner) // detected Key == (not equal) Owner
       {
           llSay(0,"You are not the Owner.");
       }
   }

</lsl>

<lsl>
   touch_start(integer num_detected)
   {
       key Avatar = llDetectedKey(0);
       string Message = "You are not the Owner.";
       // Message will not be changed, so long not the owner click.
       if(Avatar == owner)
       {
           // Message will be replaced, when the owner click.
           Message = "You are the Owner.";
       }
       llSay(0, Message);
   }

</lsl>

A reverse proof with 'else if' are not needed if you just want to use it for owner only.
That will save work and save memory for more important funktions.
Except you want different functions for different users, then you have different course as in the above examples.

<lsl>

   touch_start(integer num_detected)
   {
       key Avatar = llDetectedKey(0);
       if(Avatar == owner) // detected Key == (equal) Owner
       {
           llSay(0, "You are the Owner.");
       }
   }

</lsl>

Group / Gruppe

Bei diesem Script sieht es wieder etwas anders aus. Wenn das Object geklickt wird, ueberprueft es erst, ob der jenige der es klickt auch die selbe Gruppe traegt. Dabei ist wichtig zu wissen, das es sich um die Gruppe handelt, mit der das Object gerezzt wurde.

Beispiel 1 bessere Methode
<lsl>

// Dieses Beispiel dient nur zum Verstaendniss, was ueberhaupt im touch passiert.

default {

   state_entry()
   {
       
   }
   
   touch_start(integer num_detected)
   {
       // traegt der Avatar die gleiche Gruppe wie das Object?
       if(llSameGroup(llDetectedKey(0)) == TRUE)
       {
           llSay(0, "Touched.");
       }
       // traegt der Avatar nicht die gleiche Gruppe wie das Object?
       else if(llSameGroup(llDetectedKey(0)) == FALSE)
       {
           llSay(0,"Du traegst nicht die richtige Gruppe.");
       }
   }
   
   on_rez(integer Dae)
   {
       llResetScript();
   }

} </lsl>

<lsl>

default {

   state_entry()
   {
       
   }
   
   touch_start(integer num_detected)
   {
       key Avatar = llDetectedKey(0);
       integer Group = llSameGroup(Avatar);
       
       // traegt der Avatar die gleiche Gruppe wie das Object?
       if(Group)
       {
           llSay(0, "Touched.");
       }
       // traegt der Avatar nicht die gleiche Gruppe wie das Object?
       else if(!Group)
       {
           llSay(0,"Du traegst nicht die richtige Gruppe.");
       }
   }
   
   on_rez(integer Dae)
   {
       llResetScript();
   }

} </lsl>


VIP / Zugangsliste

Bei diesem Script sieht das Ganze voellig anders aus. Anders als bei den ersten 3 Versionen, bei denen nur alle, der Besitzer oder die ganze Gruppe festgelegt werden, kann man hier mehrere User, unabhaengig von Eigentumsrechten und Gruppenzugehoerigkeit bestimmen. Wenn das Object geklickt wird, ueberprueft es erst ob der Name der Person die es klickt auf der Liste steht.

<lsl> // User mit Resident als Nachname werden "ohne punkt und ohne Nachname" eingetragen list VIP = ["daemonika.nightfire", "jane.doe", "john.doe"];

default {

   state_entry()
   {
       
   }
   touch_start(integer num_detected)
   {
       if(~llListFindList(VIP, llCSV2List(llGetUsername(llDetectedKey(0))))) // sucht hier in der Liste nach dem Namen des klickenden
       {
           llSay(0, "Touched.");
       }
       else //if(!~llListFindList(VIP, llCSV2List(llGetUsername(llDetectedKey(0)))))
       {
           llSay(0,"Du stehst nicht auf der Liste.");
       }
   }
   
   on_rez(integer Dae)
   {
       llResetScript();
   }

} </lsl>


Von einer Verwendung von Displaynamen kann ich nur abraten, weil diese nicht einzigartig sind.
Besser ist es sich auf Usernamen oder AvatarKey's (UUID) zu konzentrieren.
Dieses Script funktioniert ebenfalls mit Keys, dazu ersetze die entsprechenden Eintraege mit folgenden Beispielen.

<lsl> // In diese Liste trage die AvatarKey's ein, welche das Scrirpt ausfuehren duerfen. list VIP = ["61ee201a-81cf-4322-b9a8-a5eb8da777c2", "00000000-0000-0000-0000-000000000000"];

// Diese if vergleicht den Key des klickenden mit der Liste. if(~llListFindList(VIP, llCSV2List(llDetectedKey(0)))) // sucht hier in der Liste nach dem Key (UUID) des klickenden </lsl>

Berechtigungen im Listener

Die Listener Variante fuehre ich nur auf, weil dort kein llDetectedKey(0) funktioniert, jedoch kann man auch dabei unterscheiden, weil der listener selber die 'id' (UUID) erkennt. Weiterhin funktioniert diese Methode in saemtlichen Events, wo zwar kein llDetectedKey(0) moeglich ist, jedoch die 'id' (UUID) des Avatars auf anderem weg erkannt wird.

Listener - Public / Oeffentlich

Dieses Script verfuegt ueber keinerlei beschraenkungen und reagiert auf jeden Avatar. <lsl> default {

   state_entry()
   {
       llListen(0, "", "", ""); // startet den listener
   }
   listen(integer chan, string name, key id, string message)
   {
       if(message == "hallo") // Reagiert auf das wort 'hallo' wenn es im chat geschrieben wird.
       {
           llSay(0, "Hallo " + llGetDisplayName(id));
       }
   }
   
   on_rez(integer Dae)
   {
       llResetScript();
   }

} </lsl>


Listener - Owner / Besitzer

In diesem Script wird der Owner gleich im llListen Befehl eingetragen. Dadurch reagiert das Script ausschliesslich auf den Owner und im Listener Event sind keine weiteren Abfragen notwendig.

<lsl> default {

   state_entry()
   {
       // Wenn das Script ausschliesslich auf den Owner reagieren soll, ist die llGetOwner() Abfrage im llListen Befehl voellig ausreichend.
       llListen(0, "", llGetOwner(), ""); // startet den listener
       
       // Alternativ kann man auch den Owner Namen direkt eintragen.
       // Das wuerde ich aber nicht empfehlen, weil es nicht dynamisch ist und im Falle des Weitergebens nicht auf den neuen Besitzer hoert.
       //llListen(0, "Daemonika Nightfire", "", ""); // startet den listener
   }
   listen(integer chan, string name, key id, string message)
   {
       // An dieser Stelle habe ich noch die alternative Methode zum abfragen des Owners inaktiv als Beispiel eingetragen.
       // Diese Methode ist nicht noetig, weil der Listener schon ab dem Befehl oben ausschliesslich auf den Owner reagiert.
     // Vorraussetzung dafuer ist ein komplett leerer llListen Befehl oben: llListen(0, "", "", "");
     //if(id == llGetOwner())
     //{
           if(message == "hallo") // Reagiert auf das wort 'hallo' wenn es im chat geschrieben wird.
           {
               llSay(0, "Hallo " + llGetDisplayName(id));
           }
     //}
   }
   
   on_rez(integer Dae)
   {
       llResetScript();
   }

} </lsl>

Listener - Group / Gruppe

Um die Gruppe abzufragen muss man wie im folgenden Beispiel schon anders vorgehen. Hierbei wird erst im Listener Event die Gruppe des Objects mit der aktiven Gruppe des Avatars verglichen und dann erst auf die Message reagiert.

<lsl> default {

   state_entry()
   {
       // hier ist es diesmal nicht moeglich die Gruppe zu vergleichen.
       llListen(0, "", "", ""); // startet den listener
   }
   listen(integer chan, string name, key id, string message)
   {
       if(llSameGroup(id) == TRUE) // ist die erkannte Gruppe des Avatars die selbe, wie die des  Objekts RICHTIG?
       {
           if(message == "hallo") // Reagiert auf das wort 'hallo' wenn es im chat geschrieben wird.
           {
               llSay(0, "Hallo " + llGetDisplayName(id));
           }
       }
   }
   
   on_rez(integer Dae)
   {
       llResetScript();
   }

} </lsl>


Listener - VIP / Zugangsliste

Wie im vorherigen Script, wird auch hier erst im Listener Event eine Zugangsliste verglichen und dann erst auf die Message reagiert.

<lsl> // In diese Liste trage die AvatarKey's ein, welche das Scrirpt ausfuehren duerfen. list VIP = ["61ee201a-81cf-4322-b9a8-a5eb8da777c2", "00000000-0000-0000-0000-000000000000"];

default {

   state_entry()
   {
       // hier ist es ebenfalls nicht moeglich die Liste zu vergleichen.
       llListen(0, "", "", ""); // startet den listener
   }
   listen(integer chan, string name, key id, string message)
   {
       if(~llListFindList(VIP, llCSV2List(id))) // sucht hier in der Liste nach dem Key (UUID) des Avatars
       {
           if(message == "hallo") // Reagiert auf das wort 'hallo' wenn es im chat geschrieben wird.
           {
               llSay(0, "Hallo " + llGetDisplayName(id));
           }
       }
   }
   
   on_rez(integer Dae)
   {
       llResetScript();
   }

} </lsl>

Wie auch oben beim Touch Beispiel kann man auch hier die Namen der Avatare abfragen.
Dazu ersetze die entsprechenden Eintraege im Script mit folgenden Beispielen.

<lsl> // User mit Resident als Nachname werden "ohne punkt und ohne Nachname" eingetragen list VIP = ["daemonika.nightfire", "jane.doe", "john.doe"];

// Diese if vergleicht den Namen des Avatars mit der Liste. if(~llListFindList(VIP, llCSV2List(llGetUsername(id)))) // sucht hier in der Liste nach dem Namen des Avatars </lsl>


Wechselbare Berechtigung als Menue Beispiel

Bevor jetzt wieder jemand meckert, warum ich das Menue so und nicht anders gemacht habe, sollte man sich vor Augen halten, dass dieses nur ein Beispiel ist und es unzaehlige Varianten zum gestalten eines Menues gibt. Hier geht es einzig und allein um die Unterscheidung der Berechtigungen.

<lsl> key owner; // globale Variable zum speichern des OwnerKey's

// In diese Liste trage die AvatarKey's ein, welche das Scrirpt ausfuehren duerfen. list VIP = ["61ee201a-81cf-4322-b9a8-a5eb8da777c2", "00000000-0000-0000-0000-000000000000"];

integer GroupAccess = FALSE; integer PublicAccess = FALSE;

integer menu_handler; integer menu_channel; menu(key user,string title,list buttons) // diese Funktion erlaubt dir unentlich viele Dialoge mit einem timer. {

   llListenRemove(menu_handler); // loescht den letzten bekannten Listener (nuetzlich falls der Timer noch nicht abgelaufen war)
   
   menu_channel = (integer)(llFrand(9999999.0) * -1);  // zufaelliger channel von -9999999.0 bis 9999999.0
   menu_handler = llListen(menu_channel,"","","");     // erstellt hier einen neuen Listener mit dem neuen Channel
   llDialog(user, title, buttons, menu_channel);       // oeffnet hier das Dialog-Fenster fuer den Benutzer
   
   llSetTimerEvent(30.0); // startet hier den Timer, der nach ablauf der Zeit den Listener loescht.

}

default {

   state_entry()
   {
       owner = llGetOwner(); // speichert den OwnerKey (UUID)
   }
   touch_start(integer num_detected)
   {
       key Avatar = llDetectedKey(0);
       
       if(Avatar == owner) // erkannter Key == (gleich) Owner
       {
           menu(owner,"Dieses Menue ist fuer den Besitzer.",["Owner","Group","Public","1","2","3","OK"]);
       }
       
       else if(~llListFindList(VIP, llCSV2List(Avatar))) // sucht hier in der Liste nach dem Key (UUID) des klickenden
       {
           menu(Avatar,"Dieses Menue ist fuer VIP's.",["1","2","3","OK"]);
       }
       
       else if(GroupAccess == TRUE)
       {
           integer Group = llSameGroup(Avatar);
           if(Group)
           {
               menu(Avatar,"Dieses Menue ist fuer Gruppenmitglieder",["1","2","3","OK"]);
           }
       }
       
       else if(PublicAccess == TRUE)
       {
           menu(Avatar,"Dieses Menue ist oeffentlich",["OK"]);
       }
   }
   
   listen(integer channel, string name, key id, string message)
   {
       // Diese Optionen koennen nur durch den Besitzer geaendert werden.
       if(message == "Owner")
       {
           GroupAccess = FALSE;
           PublicAccess = FALSE;
           llOwnerSay("Berechtigung: Besitzer");
       }
       else if(message == "Group")
       {
           GroupAccess = TRUE;
           PublicAccess = FALSE;
           llOwnerSay("Berechtigung: Besitzer & Gruppenmitglieder.");
       }
       else if(message == "Public")
       {
           GroupAccess = FALSE;
           PublicAccess = TRUE;
           llOwnerSay("Berechtigung: Alle / oeffentlich");
       }
       
       // Diese Optionen stehen sowohl Besitzer und VIP's als auch Gruppenmitgliedern zur verfuegung.
       else if(message == "1")
       {
           llSay(0,"Besitzer, VIP o. Gruppenmitglied hat die '1' gedrueckt.");
       }
       else if(message == "2")
       {
           llSay(0,"Besitzer, VIP o. Gruppenmitglied hat die '2' gedrueckt.");
       }
       else if(message == "3")
       {
           llSay(0,"Besitzer, VIP o. Gruppenmitglied hat die '3' gedrueckt.");
       }
       
       // Diese Option stehen allen zur verfuegung.
       else if(message == "OK")
       {
           llSay(0,"Es wurde auf 'OK' gedrueckt.");
       }
   }
   
   timer()
   {
       llSetTimerEvent(0.0); // stoppt den Timer
       llListenRemove(menu_handler); // loescht den aktuellen Listener
   }
   
   on_rez(integer Dae)
   {
       llResetScript();
   }

} </lsl>