• Bitte schaltet eure Ad Blocker aus. SLinfo kann nur betrieben werden, wenn es durch Werbung Einnahmen erzielt. Vielen Dank!!
  • Wir freuen uns, wenn du dich in unserem Forum anmeldest. Bitte beachte, dass die Freigabe per Hand durchgeführt wird (Schutz vor Spammer). Damit kann die Freigabe bis zu 24 Stunden dauern.
  • Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und die Zugriffe auf unsere Website zu analysieren. Sie geben Einwilligung zu unseren Cookies, wenn Sie unsere Webseite weiterhin nutzen.

Erste RLV versuche, was mach ich falsch ?

Nadja Black

Nutzer
Hallo an alle ,

ich versuche mich an ersten RLV schritten und hab einen poseball gemacht.
derjenige der drauf sitzt soll in meinem ersten test nur mal Inventar gesperrt bekommen, über eine remote.
Es funktioniert nicht , und ich weiß nicht wirklich was ich falsch gemacht hab.
Vieleicht kann mir jemand nen Tip geben ?

Code:
key VictimID;
integer CHANNEL_RELAY = -1812221819; 


default{
      state_entry()

    {
        llSetStatus(STATUS_PHANTOM, TRUE);
        llListen(911, "", NULL_KEY, "" );
    }
    
    on_rez(integer num)
    {
        llResetScript();
    }

  listen(integer number, string name, key id, string message)
       {
    if(message=="-IM")
        {
            llWhisper(PUBLIC_CHANNEL, "Victim is ....maybe..... denied to use INV o.O ");
         llSay(CHANNEL_RELAY, "relaytest," + (string) VictimID + ",@showinv=n");
        }
    }
     
       changed(integer change) {
          if (change & CHANGED_LINK) {
              key VictimID = llAvatarOnSitTarget();
              if ( VictimID != NULL_KEY )  {
                 llWhisper(PUBLIC_CHANNEL,  "Victim" + (string) VictimID + " on table.");
            }}}}

Vorab schon mal vielen Dank für die Mühe :)

LG Nadja
 
Zuletzt bearbeitet:
Hallo Nadja

Also, der Skript ist fast richtig :) ich finde da nur einen Fehler, du deklarierst VictimID als globale Variable (korrekt), damit der den Victim auch nach dem setzen kennt, aber im changed event, machst du die Variable wieder lokal und damit speichert der Script die ID des Victims nicht global. Nach dieser Änderung müsste der Skript also laufen:

Code:
       changed(integer change) {
          if (change & CHANGED_LINK) {
              VictimID = llAvatarOnSitTarget();
              if ( VictimID != NULL_KEY )  {
                 llWhisper(PUBLIC_CHANNEL,  "Victim" + (string) VictimID + " on table.");
            }}}

Da es ein Gehversuch ist, ist das kein Fehler, aber vorsichtshalber.. Ich würde das Befreien des Victims mit einbauen, in den Changedevent, sonst läuft das Opfer dann nach Aufstehen immer noch ohne Inventar rum :)

Code:
       changed(integer change) {
          if (change & CHANGED_LINK) {
              key agent = llAvatarOnSitTarget();
              if ( agent != NULL_KEY )  {
                 VictimID = agent;
                 llWhisper(PUBLIC_CHANNEL,  "Victim" + (string) VictimID + " on table.");
              }
              else {
                 llSay(CHANNEL_RELAY, "relaytest," + (string) VictimID + ",!release");
                 VictimID = NULL_KEY;
              }
            }}

Das Freilassen ist evtl nötig wenn der versperrt wurde, also im Listen in einer globalen Variable merken, ob man dem aktuellen Victim den Inventar gesperrt hat und erst wenn ja, entsperren beim Aufstehen.

Hoffe die skripte gehen, weil ich gerade nicht on bin.
 
@ Nadja:Du hast da mehrere Fehler drinne:

Zum einen definierst du eine globale Variable VictimID, die aber nie belegt wird, denn im Changed-Event definierst du noch mal eine lokale Variable mit dem selben Namen.
Dann fehlt im Script die Definition eines gültigen (nicht-null...) Sit-Targets über llSitTarget, denn ohne das funktioniert llAvatarOnSitTarget nicht.
Das dritte Problem ist, dass du da im Script nie den Listen-Event auslöst.
Ansonsten muss das Script auch noch das !release Metacommand senden, wenn die Session zu ende ist und es muss eigentlich mit einem "!pong" an den User auf die pings vom Relay antworten, das kann man aber in dem Fall wohl vernachlässigen beim Testen. (Specs: http://wiki.secondlife.com/wiki/LSL_Protocol/Restrained_Love_Relay/Specification)


ganz einfaches Beispiel:
PHP:
key VictimID;
key VictimID_old;
integer CHANNEL_RELAY = -1812221819;

default{
    state_entry(){
        //damit llAvatarOnSitTarget geht:
        llSitTarget(<0.0, 0.0, 0.1>, ZERO_ROTATION);
    }

    changed(integer change){
        if (change & CHANGED_LINK){
            //UUID speichern um Inventory freischalten zu können...
            VictimID_old = VictimID;
            VictimID = llAvatarOnSitTarget();
            if ( (VictimID == NULL_KEY) && (VictimID_old != NULL_KEY)){
                llSay(CHANNEL_RELAY, "relaytest," + (string) VictimID_old + ",!release");
                llWhisper(0,"Victim now can access inventory!");
            }
            else{
                llSay(CHANNEL_RELAY, "relaytest," + (string) VictimID + ",@showinv=n");
                llWhisper(PUBLIC_CHANNEL, "Victim is ....maybe..... denied to use INV o.O ");
            }
        }
    }
}

(Edit:sorry Jenna, hab zu spät gesehen dass du auch was gepostet hast)
 
Zuletzt bearbeitet:
Sorry für die späte Antwort, war in urlaub ;)


Wenn ich das "key" rausnahm, funktionierte es schon, konnte dann so natürlich nicht mehr mein inv benutzen, hab das aber dann noch ertweitert und jetzt geht alles wie erwünscht.

@ Shirley Luga
aber ich hab doch da einen Listener drinnen, oder versteh ich da was falsch ?

Vielen Dank euch beiden, vieleicht lern ich es irgendwann , hihi ;)

LG Nadja
 
Zuletzt bearbeitet:
@ Shirley Luga
aber ich hab doch da einen Listener drinnen, oder versteh ich da was falsch ?

Vielen Dank euch beiden, vieleicht lern ich es irgendwann , hihi ;)

LG Nadja

Du hast da einen Listener drin, ja. Allerdings hört dein Script nur auf Kanal 911. D.h. für deinen "-IM" Befehl. Das habe ich damit allerdings nicht wirklich gemeint.

Das RLV-Protokoll sieht vor, dass Relay und RLV-Objekt auch kommunizieren können, damit das Relay weiß ob die Objekte noch da sind. Deswegen muss dein Objekt auch auf jeden Fall mit einem "ping,<user_uuid>,!pong" anworten, wenn das Relay auf dem RLV-Channel mit einem "ping,<object_uuid>,ping,ping" anfragt ob das Objekt noch da ist. Und dafür muss dein Objekt auch noch auf dem RLV-Kanal einen Listener aufmachen. <user_uuid> ist in dem Fall der Key des Avatars mit dem Relay, <object_uuid> ist in dem Fall der Key deines Objekts.
Manche Relays fragen dieses "ping" nämlich regelmäßig ab (einmal pro Minute oder so), und kommt dann in absehbarer Zeit kein "pong" von deinem Poseball, dann denkt das Relay, dass dein Objekt nicht mehr da ist und hebt alle Einschränkungen usw. auf.

Das kann dann beim Testen zu unvorhergesehenen Problemen führen ;-)
 

Users who are viewing this thread

Zurück
Oben Unten