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

Andere Scripte per Touch beenden

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! :)

kussmund01.gif
 
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:
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;
        }
    }     
}
 
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:
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.
 
...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.

Ja, in dem Fall muss man testen, ob man resetten muss oder nicht, im konkreten Fall hab ich zu viel wegoptimiert :)

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

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

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

The script appears to stop when its time slice ends, not sooner. If a script tries to stop itself then some LSL code following the llSetScriptState call may be executed before the script stops.

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

kussmund01.gif
 

Users who are viewing this thread

Zurück
Oben Unten