• 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.

llSetTimerEvent: invalid key passed to instant message

tom.fox

Nutzer
Hi alle zusammen...

ich erkläre mal kurz was mein objekt macht: bevor ich eine leistung erbringe muss der user per "pay" zahlen. danach "touchen" um die eigentliche leistung zu bekommen.

während dem touch-prozess läuft ein timerEvent. nach 5 min wird die timer-funktion aufgerufen und das skript wird zurückgesetzt. soll verhindern dass das terminal für immer blockiert wird. soweit funzt das skript perfekt.

nun ist mir folgendes eingefallen. was ist wenn man auf "pay" drückt und einfach weggeht? auch dann wäre das terminal ewig blockiert. um das zu verhindern habe ich noch ein zweites timerEvent eingebaut, dass aktiv wird wenn "pay" gedrückt ist. Doch ich bekomme folgende Meldung:

"Invalid Key passed to instant message."

ich frage mich was das timerEvent mit ner IM zu tun hat ^^ ? habe auch im default state ne eigenes listen event eingebaut. hat auch nix gebracht


Code:
//Objekt berührt, timeEvent startet
touched()
{
 if (currentUser == llDetectedKey(0) || currentUser == NULL_KEY)
        {
            llSetTimerEvent(0);
            llInstantMessage(llDetectedKey(0),"You are the current user of this terminal");
            currentUser = llDetectedKey(0);
            llSetTimerEvent(60);
            name = llDetectedName(0);
            integer ch = ChannelFromName(name);
                
                
            llListen(ch,"",currentUser,"");
            llDialog(llDetectedKey(0), "Pick a Number. Use the navigation buttons for different numbers! ", PC__01_09, ch);
          }
        
        else
        {
            llInstantMessage(llDetectedKey(0),"This system is already in use. Please use another terminal.");
        }
       
}



default
{

   
    state_entry()
    {
     llSetPayPrice(PAY_HIDE,[10,PAY_HIDE,PAY_HIDE,PAY_HIDE]); 
    }
    
    
    money(key giver, integer amount)
    {  
       
     state payed;   
    }   
    
    

    state_exit()
    {
      llSetTimerEvent(30); //nach bezahlen hat user 30s zeit bevor er  aus- 
                                    //ausgeloggt wird 
      llMessageLinked(LINK_ALL_CHILDREN, 0, "PAYED", NULL_KEY);
      llSay(0,"Please TOUCH the keyboard to pick your numbers.");
    }


 }//default                        
                
                

state payed
{

    state_entry()
    {

      currentUser = NULL_KEY;
      
    }

    
    touch_start(integer total_number)   
    { 
     touched();             
    }


    listen(integer channel, string name, key id, string message) 
    {
     integer ch = ChannelFromName(name);   
     listening(ch,name,id,message);  
    }    
   
   

    timer()
    {
         integer ch = ChannelFromName(name);
         llInstantMessage(currentUser,"Time is up. You were logged off");
         

         currentUser = NULL_KEY;        
         llResetScript();    

    }
    
    
    state_exit()
    {
        
    }
    
}

vielen dank für eure mühe und zeit :)
 
Moin,

tom.fox schrieb:
...
bevor ich eine leistung erbringe muss der user per "pay" zahlen. danach "touchen" um die eigentliche leistung zu bekommen.
...
nun ist mir folgendes eingefallen. was ist wenn man auf "pay" drückt und einfach weggeht? auch dann wäre das terminal ewig blockiert. um das zu verhindern habe ich noch ein zweites timerEvent eingebaut, dass aktiv wird wenn "pay" gedrückt ist. Doch ich bekomme folgende Meldung:

Der Kunde hat also bezahlt und verschwindet. Warum, wenn er bezahlt hat? Ok, z.B. könnte SL crashen...

So wie es jetzt ist, wäre das ein prima Service/Argument. -> Kunde kommt nach Crash wieder zurück, "touched", und kann Deine Leistung doch noch in Anspruch nehmen.

Code:
"Invalid Key passed to instant message."
In dem Codeteil verwendest du dreimal llInstantMessage() mit verschiedenen Agent-Keys (llDetectedKey(0), currentUser).

Welches llInstantMessage() verursacht den Fehler?

Ich tippe mal auf den Teil:
Code:
 if (currentUser == llDetectedKey(0) || currentUser == NULL_KEY)
        {
            llSetTimerEvent(0);
            llInstantMessage(llDetectedKey(0),"You are the current user of this terminal");
            currentUser = llDetectedKey(0);
            llSetTimerEvent(60);
            name = llDetectedName(0);
            integer ch = ChannelFromName(name);
               
               
            llListen(ch,"",currentUser,"");
            llDialog(llDetectedKey(0), "Pick a Number. Use the navigation buttons for different numbers! ", PC__01_09, ch);
          }
       
        else
        {
            llInstantMessage(llDetectedKey(0),"This system is already in use. Please use another terminal.");
        }
In beiden Fällen schickst Du ein llInstantMessage(llDetectedKey(0)," ...") ab, obwohl Du ja genau nach llDetectedKey(0) abfrägst...

Grüße

Keane
 

Users who are viewing this thread

Zurück
Oben Unten