HX3 Foren

HX3 Foren (http://hx3.de/)
-   Editing (http://hx3.de/editing-139/)
-   -   Einfache Check-Schleife (sqf) (http://hx3.de/editing-139/einfache-check-schleife-sqf-14965/)

Mr.g-c 11.07.2008 16:18

Einfache Check-Schleife (sqf)
 
Hallo ich möchte einen einfachen "Check" ahben der alle paar sekunden checkt ob ein bestimmtes Fahrzeug (welches respawnt) noch am Leben ist, und wenn nicht dann einfach eine Hint message rausgibt.

Folgendes ist meine Version:
Code:

if (!isServer) exitWith {};
while {true} do {
            if (!alive specialvehicle || !alive special_einheit) then {
            hint localize ""STRS_einheit_destroyed"";
            specialvehicle setdamage 1;
            special_einheit setdamage 1;
            };
    sleep 2;
    };

Problem hierbei ist, dass die Hint nachricht im dauer angezeigt wird bis das Fahrzug und die Einheit respawnt. Das kann manchmal 20 minuten dauern und ist recht nervig.

Wie mache ich es, dass die Nachright nur einmal erscheint aber TROTZDEM beim nächsten möglichen "tod" der Einheit wieder enazeigt?

Mr.g-c 11.07.2008 16:47

So habe ne einfache Lösung.... einfach das "then" mit "exitwith" ersetzt und den check von einem anderen Script aus starten gelassen (nämlich dem welches mein Fahrezug respawnt).

Vienna 11.07.2008 16:53

Du mußt natürlich aus der Schleife raus, wenn sie ihren Zweck erfüllt hat.

Würde so gehen:

while (alive specialvehicle AND alive special_einheit) do {sleep 2};

Üblich ist aber so (ausser du willst nur alle 2 Sekunden abfragen):

waitUntil {!alive specialvehicle OR !alive special_einheit};

hint localize ""STRS_einheit_destroyed"";
specialvehicle setdamage 1;
special_einheit setdamage 1;

Hier könntest du noch anfügen, dass die Objekte z.B. nach 5 Minuten vollständig aus dem Spiel entfernt werden.

sleep 300;
deleteVehicle specialvehicle;
deleteVehicle special_einheit;

Bei der while Schleife ist zu beachten, dass sie nach 10.000 Durchläufen in ArmA automatisch beendet wird.

Mr.g-c 12.07.2008 02:26

Code:

waitUntil {!alive specialvehicle OR !alive special_einheit};

hint localize ""STRS_einheit_destroyed"";
specialvehicle setdamage 1;
special_einheit setdamage 1;

Läuft das script dann für immer, oder muss ich es ebenfalls jedesmal neu laden lassen?

Bist du dir mit den 10.000 durchläufen sicher?
Sahrani-Life zb läuft manchmal 3000 minuten und dort sind massiv 1 sekündige while-schleifen im einsatz...

Vienna 12.07.2008 10:39

Das Skript läuft nur so lange, bis eines der Objekte zerstört ist.

Wenn du die Variablenamen wieder für neue Objekte verwendest, dann mußt du das Skript neu starten. Das ist so auch am sichersten, weil die "Schleife" die neuen Objekte in den Variablen möglicherweise nicht erkennt!

Die beiden Objekte übergibst du als Parameter, so ersparst du dir zwei globale Variable (falls du sie sonst nicht benötigest) und du kannst das Skript auch noch für andere Objekte verwenden.

Zu While ... do

Note (Applies to 1.85-1.97): Maximum repeat count for loop is 10000.
If condition is still true after loop was repeated 10000 times, loop is terminated and error message is shown.

Das war bei ArmA zu Beginn noch so. Möglich das sich da inzwischen was geändert hat. Ist ja leicht auszutesten.

Bis jetzt hat man eine unbegrenzte Endlosschleife so ausgeführt:
Code:

for [{_i=0},{_i<1},{_i=_i}] do
 {
  ...;
  ...;
  sleep 0.01;
  //Schleife verlassen?
  if(???)then(_i=1);
 };

Ich habe die Laufzeit der Schleifen getestet hier der Link:
http://hx3.de/editing-139/grenzen-wh...67/#post184096


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:25 Uhr.

Angetrieben durch vBulletin, Entwicklung von Philipp Dörner & Tobias


SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116