Script stoppen und weiterlaufen lassen

  • Multiplayer

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Script stoppen und weiterlaufen lassen

    Hallo zusammen :)

    Wie ist es möglich, mehrere laufende Scripte, durch einen Auslöser bei Aktivierung zu unterbrechen und bei Deaktivierung weiterlaufen zu lassen?

    Folgendes Szenario:

    Auf einer Schießbahn wird durchgehend in einem Multiplayerszenario geschossen, sobald einer der Spieler auf die Bahn läuft sollen die Scripte, die die Soldaten schießen lässt unterbrochen werden und ein anderes Script mit Warnhinweis als Text und Ton eingeschaltet werden. Verlässt der Spieler die Bahn wieder so sollen die Scripte wieder anlaufen und es soll weiter geschossen werden.

    Ich habe es schon probiert den Auslöser als Variable zu definieren und mit if then else probiert, leider keinen Erfolg gehabt.

    Jede Idee ist willkommen :thumbup:
  • Hallo

    Hab nun mal folgendes Script auf die Reihe bekommen.
    Variable1 wird hier durch den Auslöser jeweils auf true oder false gesetzt.

    Das script läuft seine while schleife ab und erkennt dann in welchem Zustand sich Variable1 befindet. Ich möchte aber gerne dass das Script sofort unterbrochen wird und auch die Sidechat Nachricht kommt, sobald jemand den Auslöser betätigt (also Variable1 verändert) und auch !!automatisch weiterläuft wenn Variable1 wieder auf true ist, leider muss man bei dieser Variante das script immer neu auslösen lassen.

    Quellcode

    1. _weapon1 = currentWeapon Schuetze1;
    2. Schuetze1 addeventhandler ["reloaded", {(_this select 0) addmagazine "CUP_30Rnd_556x45_Stanag"}];
    3. while {alive Schuetze1} do
    4. {
    5. IF (!Variable1) exitWith {Verwalter1 Sidechat "Personen auf der Schießbahn!"};
    6. IF (Variable1) THEN
    7. {
    8. Schuetze1 enableAI "Target";
    9. Schuetze1 dotarget Ziel1;
    10. Schuetze1 forceWeaponFire [_weapon1, "single"];
    11. sleep 3;
    12. Schuetze1 forceWeaponFire [_weapon1, "single"];
    13. sleep 1;
    14. Schuetze1 forceWeaponFire [_weapon1, "single"];
    15. sleep 4;
    16. Schuetze1 forceWeaponFire [_weapon1, "single"];
    17. sleep 4;
    18. Schuetze1 forceWeaponFire [_weapon1, "single"];
    19. sleep 2;
    20. Schuetze1 forceWeaponFire [_weapon1, "single"];
    21. sleep 1;
    22. Schuetze1 forceWeaponFire [_weapon1, "single"];
    23. sleep 1;
    24. }
    25. };
    Alles anzeigen
  • Ist ja auch klar. Da steht ja exitWith. Damit wird die while-Schleife endgültig beendet. Die Zeile muss Raus. Dann muss aber auch ein anderes sleep in das Skript, da ansonsten die Schleife ungebremst zehntausende Male pro Frame ausgeführt wird.

    forceWeaponFire hat globale Effekte. sideChat hat lokale Effekte. Also entweder das Skript läuft auf jedem Clienten und versucht dementsprechend vergeblich die remote KI zum feuern zu überreden, oder das Skript läuft nur auf einem Rechner und die Chatnachricht wird nicht angezeigt. Beides seltsam. Wie wird dieses Skript denn aufgerufen, bzw. auf welchen Maschinen wird es denn ausgeführt?
  • Habs jetzt mal mit der BIS_fnc_MP probiert, damit sollte jeder Spieler eine hint Meldung bekommen dass sich Leute auf der Bahn befinden. Leider wird, wie du sagst, ELSE dauerhaft in der Schleife ausgelößt. Gibt es denn einen ähnlichen Befehl wie den goto? Den man auch in sqf nutzen könnte, oder wie kann ich das Problem umgehen? Und dass das script sofort angehalten wird nicht erst am Ende der Schleife.

    Quellcode

    1. _weapon1 = currentWeapon Schuetze1;
    2. Schuetze1 addeventhandler ["reloaded", {(_this select 0) addmagazine "CUP_30Rnd_556x45_Stanag"}];
    3. while {alive Schuetze1} do
    4. {
    5. IF (Variable1) THEN
    6. {
    7. Schuetze1 dotarget Ziel1;
    8. Schuetze1 forceWeaponFire [_weapon1, "single"];
    9. sleep 3;
    10. Schuetze1 forceWeaponFire [_weapon1, "single"];
    11. sleep 1;
    12. Schuetze1 forceWeaponFire [_weapon1, "single"];
    13. sleep 4;
    14. Schuetze1 forceWeaponFire [_weapon1, "single"];
    15. sleep 4;
    16. Schuetze1 forceWeaponFire [_weapon1, "single"];
    17. sleep 2;
    18. Schuetze1 forceWeaponFire [_weapon1, "single"];
    19. sleep 1;
    20. Schuetze1 forceWeaponFire [_weapon1, "single"];
    21. sleep 1;
    22. } ELSE
    23. {["Personen auf der Schießbahn!","hint",true,true] call BIS_fnc_MP;}
    24. };
    Alles anzeigen
  • Zunächst muss das ẞ aus dem Filename.

    Anschließend wird der Trigger im Editor Trigger1 genannt.

    Dann würde ich das ganze so schreiben:


    Außerdem würde ich den Trigger durch einen Marker (gleicher Name oder Name im Skript ersetzen) ersetzen. Wenn du das aus irgend einem Grund nicht willst, dann würde ich den Trigger auf jeden Fall auf "Server Only" setzen, auch wenn es wie gesagt gar keinen Trigger braucht.
  • waitUntil ist selbst eine Schleife. Sie wiederholt sich bis das letzte Statement `true` zurück gibt: Hier also, bis keine Leute mehr in Trigger1 sind.
    Mit call compile preprocessFile kann man die Funktion aufrufen, ohne eine neue Skriptinstanz zu öffnen. Stattdessen öffnet man die Schleife in der Funktion mit spawn. Dadurch hat man eine Funktion, die in der unscheduled Environment aufgerufen werden kann, oder ansonsten nicht den Rest der init.sqf blockiert. Das ist sauberer.
    Außerdem kann man, in dem man die Funktion in einer Variable speichert, vermeiden, dass die SQF-Datei mehrfach vom Spiel gelesen werden muss, und dann preprozessiert werden muss, und dann der Inhalt mehrfach kompiliert werden muss... Das alles passiert bei execVM, obwohl man oft das ganze stattdessen einfach nur mehrfach aufrufen möchte.