1. Bitte schaltet eure Ad Blocker aus. SLinfo kann nur betrieben werden, wenn es durch Werbung Einnahmen erzielt. Vielen Dank!!
    Information ausblenden
  2. 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.
    Information ausblenden
  3. 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.
    Information ausblenden

Andere Scripte per Touch beenden

Dieses Thema im Forum "Fragen zu Scripting" wurde erstellt von Nightfairy Wrydan, 19. März 2013.

  1. Nightfairy Wrydan

    Nightfairy Wrydan Nutzer

    Beiträge:
    38
    Zustimmungen:
    13
    Punkte für Erfolge:
    8
    Tagchen! :)

    Das Problem ist folgendes: Ich möchte einen Kamin bauen, bei dem ich per Touch das Feuer-Script abschalten kann - leider ist das no-mod, so dass ich keinen stop-on-touch-Befehl einfügen kann.
    Grundsätzlich muss die Möglichkeit bestehen, andere Scripte durch ein weiteres zu stoppen, das sieht man hier .. leider ist auch dieses Script no-mod, so dass ich keine "Stop alle Partikel-Zeile" wie diese
    Code:
    llParticleSystem([]);
    einfügen kann - selbständig kann das angebotene Script das wohl nicht bewirken, sonst läge kein "Putzfrau-Script" dabei.

    Sooo, liebe, überaus fähige Scripter - nun seid Ihr gefragt. Ich bedanke mich im Voraus artig für die Hilfe! :)

    [​IMG]
     
  2. Mareta Dagostino

    Mareta Dagostino Superstar

    Beiträge:
    1.313
    Zustimmungen:
    99
    Punkte für Erfolge:
    49
    EDIT: Siehe den Beitrag von Elyion Arai, llSetScriptState(scriptName,FALSE) ermöglicht das Stoppen und spätere (!) Starten von fremden Scripten im gleichen Prim. Nur Scripte, die mit diesem Befehl gestoppt wurden, können später mit dem Befehl wieder gestartet werden.

    (Um nachfolgende Leser nicht zu irritieren, habe ich den komplizierten Vorschlag entfernt, der hier vorher stand.)
     
    Zuletzt bearbeitet: 19. März 2013
  3. Elyion Arai

    Elyion Arai Nutzer

    Beiträge:
    69
    Zustimmungen:
    6
    Punkte für Erfolge:
    18
    Also ich hoffe, dies wird dein kleines Dilemma beheben. Su hat mich deswegen schon gestern gefragt. Also wenn das hier funktioniert, dann sag ihr ganz lieb danke. *g*
    Falls ich noch Fehler drin hab, dann entschuldige ich mich im Voraus und Verbesserungen sind jederzeit gern gesehen. *schmunzelt*

    Code:
    integer onoff=1;
    default
    {
        touch_start(integer num_detected)
        {
            integer numberOfScripts = llGetInventoryNumber(INVENTORY_SCRIPT); 
            integer index;
            
            if(onoff==1)
            {           
                do
                {                
                    string scriptName = llGetInventoryName(INVENTORY_SCRIPT, index);
                    integer scriptState = llGetScriptState(scriptName);
                    if(scriptName!=llGetScriptName())
                    {
                        llSetScriptState(scriptName,FALSE);
                        llParticleSystem( [ ] );
                        llSleep(0.1);
                    }
                 }
                while (++index < numberOfScripts); 
                llSay(PUBLIC_CHANNEL,"Alle Scripte wurden deaktiviert.");
                onoff=0;
            }
            else if (onoff==0)
            {           
                do
                { 
                    string scriptName = llGetInventoryName(INVENTORY_SCRIPT, index);
                    integer scriptState = llGetScriptState(scriptName);
                    if(scriptName!=llGetScriptName())
                    {
                        llSetScriptState(scriptName,TRUE);
                        llResetOtherScript(scriptName);
                    }
                }
                while (++index < numberOfScripts);
                llSay(PUBLIC_CHANNEL,"Alle Scripte wurden aktiviert."); 
                onoff=1;
            }
        }     
    }
     
  4. Jenna Felton

    Jenna Felton Superstar

    Beiträge:
    1.993
    Zustimmungen:
    66
    Punkte für Erfolge:
    64
    Ich würde von diesem Befehl lieber abraten

    llResetOtherScript(scriptName);

    besonders wenn der Skript nomod ist. Durchs Zurücksetzen verliert er alle seine gewonnene Daten und was das sind kann man nicht sehen. Kann sien dass er hinterher nicht so funktioniert wie man möchte :) Statdessen würde ich bei diesem Befehl lassen

    llSetScriptState(scriptName,TRUE);

    Der startet den Skript einfach wieder, das Zurücksetzen hinterher sollte eigentlich nicht nötig sein.

    Edit: Ich optimiere mal den Skript etwas, der solte so wie beabsichtigt auch funktionieren.

    Code:
    integer onoff=1;
    default
    {
        touch_start(integer num_detected)
        {
            integer numberOfScripts = llGetInventoryNumber(INVENTORY_SCRIPT); 
            integer index;
            string  myName = llGetScriptName();
            
            if(onoff)
            {           
                do
                {                
                    string scriptName = llGetInventoryName(INVENTORY_SCRIPT, index);
                    if(scriptName != myName)
                    {
                        llSetScriptState(scriptName,FALSE);
                        llSleep(0.1);
                    }
                }
                while (++index < numberOfScripts);
    
                llSay(PUBLIC_CHANNEL,"Alle Scripte wurden deaktiviert.");
                onoff = FALSE;
    
                llParticleSystem( [ ] );
            }
            else
            {           
                do
                { 
                    string scriptName = llGetInventoryName(INVENTORY_SCRIPT, index);
                    if(scriptName != myName)
                    {
                        llSetScriptState(scriptName,TRUE);
                    }
                }
                while (++index < numberOfScripts);
    
                llSay(PUBLIC_CHANNEL,"Alle Scripte wurden aktiviert."); 
                onoff = TRUE;
            }
        }     
    }
    Aber wozu die Pause via llSleep(0.1);? Habe sie aber da gelassen
     
    Zuletzt bearbeitet: 20. März 2013
  5. Elyion Arai

    Elyion Arai Nutzer

    Beiträge:
    69
    Zustimmungen:
    6
    Punkte für Erfolge:
    18
    Vielen Dank, Jenna für das Korrigieren.
    Ich bin selbst noch blutiger Anfänger im Scripten. Man übe bitte Nachsicht.

    Bei Nightfairy 's Problem geht es um ein Partikelfeuer. Bei meinem Beispielscript reichte das erneute Aktivieren des Scriptes nicht aus. Da half dann nur das Resetten.
    Aber du hast recht, ich bin sowieso der Meinung, es ist besser sein eigenes Script zu schreiben, anstatt nomod Scripte zu manipulieren. *schmunzelt*

    Ach ja, dieses Sleep habe ich aus dem Beispiel in der LSL Wiki entnommen:

    http://wiki.secondlife.com/wiki/LlSetScriptState

    Mein Englisch ist sehr grottig und früher war ich deshalb immens dankbar für die Slinfo Script Wiki (die nun leider weg ist).
    Also weil ich mir nicht sicher war, ob es sinnvoll ist oder nicht, deswegen hab ich es einfach drin gelassen.
     
  6. sven Homewood

    sven Homewood R.I.P.

    Beiträge:
    1.894
    Zustimmungen:
    88
    Punkte für Erfolge:
    48
    Das llSleep ist wahrscheinlich darin enthalten, um zu 100% sicher zu sein, dass das andere Script wirklich gestoppt ist, weil das gestoppte Script nicht sofort anhält.
     
  7. Jenna Felton

    Jenna Felton Superstar

    Beiträge:
    1.993
    Zustimmungen:
    66
    Punkte für Erfolge:
    64
    Ja, in dem Fall muss man testen, ob man resetten muss oder nicht, im konkreten Fall hab ich zu viel wegoptimiert :)

    Aha, interessant. Die Wiki sagt (war mir auch neu),

    Also zu Deutsch, der Skript scheint am Ende der Zeitscheibe anzuhalten, nicht vorher. Und bis das passiert, können auch einige Befehle nach dem llSetScriptState ausgeführt werden, bevor der Skript anhält. Dieser Pausenbefehl mogelt sich also als diesen Code, der unkontrolliert asgeführt wird, damit der Befehl den Skript auch an der Stelle anhällt und nicht später.

    Es geht also ums Anhalten sich selbst. Zum Anhalten anderer Skripte bräuchte man den Befehl nicht.
     
  8. Nightfairy Wrydan

    Nightfairy Wrydan Nutzer

    Beiträge:
    38
    Zustimmungen:
    13
    Punkte für Erfolge:
    8
    Sooo .. ich hatte nun Zeit, beide Varianten, die von Elyon und die von Jenny, zu testen: Das von Ely klappt, Deins, Jenny, schaltet zwar das laufende Script ab, aber es aktiviert sie aus irgendwelchen Gründen nicht wieder! *grübelt*

    Für Leute, die das Script auch verwenden wollen empfehle ich außerdem, in Ely's Entwurf in diesem Abschnitt:
    Code:
                        llSetScriptState(scriptName,FALSE);
                        llParticleSystem( [ ] );
                        llSleep(0.1);
    vor dem llSleep die Zeile
    Code:
     llStopSound();
    einzufügen, der Sound lief nämlich bei mir sonst einfach weiter! :)

    Ich danke Euch ganz ganz herzlich für die schnelle und kompetente Hilfe!!

    [​IMG]
     

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden