Armed-Assault.de Twitter
 
 
Themen-Optionen Ansicht
Alt 27.04.2011, 19:30   #1 (permalink)
Newbie
 
Registriert seit: 27.03.2011
Beiträge: 8
Standard Befehl im Befehl

Hallo zusammen,

obwohl ich noch recht neu in der arma scripting welt bin, bastel ich bereits an einer hoffentlich feinen ACE Coop Mission (werde sie in kürze veröffentlichen, Link folgt gerne/selbstverständlich). ich hab hier zwar noch nie eine wirklich Frage stellen müssen, nun ist es aber doch soweit, dass ich da mal eine Frage hätte...

Ich habe zwei "waituntil" befehle untereinander in einem script, die ich gerne in einem befehl ausführen lassen möchte (möchte nur soviel code schreiben, wie eben notwendig ist, was zuviel ist, ist halt zuviel), nur komme ich (trotz showscripterrors und anderer hilfen) ständig mit den klammern und dem semikolon durcheinander, auf jedenfall hab ich ständig n scripterror...

so funktionierts einwandfrei, sind aber halt zwei abfragen hintereinander, asntatt einer...

Code:
waituntil {tango in vipconvb  && guarda in vipconva && guardb in vipconva};
waituntil {{_x  in vipconvc} foreach units grpescort};




wie führe ich nun
Code:
waituntil {{_x  in vipconvc} foreach units grpescort};
innerhalb des befehls
Code:
waituntil {tango in vipconvb  && guarda in vipconva && guardb in vipconva};
aus ?

anmerken möchte ich, dass es einzeln benannte personen sind (tangeo,guarda,guardb) und eine kleine gruppe ist...

wäre für hilfe wirklich dankbar, danke !

gruß, wolf

edit : sorry für topic, wusste nicht was ich hätte besser schreiben soll...

Geändert von *Wolf* (27.04.2011 um 20:03 Uhr).
*Wolf* ist offline  
Alt 27.04.2011, 20:07   #2 (permalink)
10 Jahre hx3
5000 Beiträge10.000 Beiträge15.000 Beiträge
 
Benutzerbild von burns
 
Registriert seit: 13.04.2003
Ort: Monerica
Alter: 42
Beiträge: 32.984
Standard

Code:
alledrin=false; publicvariable alledrin;

if (alledrin) then {
	waituntil {tango in vipconvb  && guarda in vipconva && guardb in vipconva};
	losfahren=true;
} else {
	if (!alledrin) then {
	waituntil {{_x  in vipconvc} foreach units grpescort};
	};
	alledrin=true;
};
Ohne Garantie und ungetestet .. mir war grad nach etwas Sudoku ähnlicher Beschäftigung.
Weiss jetzt auch nicht ob er nach dem 1. else überhauptnochmal zurck zur 1. Abfrage geht ..
__________________

burns ist offline  
Alt 27.04.2011, 20:13   #3 (permalink)
Newbie
 
Registriert seit: 27.03.2011
Beiträge: 8
Standard

hi burns,

ne du... gut gemeint, aber daneben... will ja keine if,then,else sache...

waituntil {tango in vipconvb && guarda in vipconva && guardb in vipconva && {{_x in vipconvc} foreach units grpescort};

so in etwa hab ich mir das vorgestellt, aber das klappt nicht ganz. es geht aber auch darum, dass des script eben wartet, bis alle eingestiegen sind, und da eine gruppe dabei ist, musste ich ja des mitm {_x..blabla} machen...

netter versuch, danke !!

Geändert von *Wolf* (27.04.2011 um 20:15 Uhr).
*Wolf* ist offline  
Alt 27.04.2011, 20:16   #4 (permalink)
500 Beiträge
 
Benutzerbild von Anemia
 
Registriert seit: 20.05.2009
Beiträge: 605
Standard

Zitat von *Wolf* Beitrag anzeigen

hi burns,

ne du... gut gemeint, aber daneben... will ja keine if,then,else sache...

waituntil {tango in vipconvb && guarda in vipconva && guardb in vipconva && {_x in vipconvc} foreach units grpescort} && {{_x in vipconvc} foreach units grpescort};

so in etwa hab ich mir das vorgestellt, aber das klappt nicht ganz. es geht aber auch darum, dass des script eben wartet, bis alle eingestiegen sind, und da eine gruppe dabei ist, musste ich ja des mitm {_x..blabla} machen...

netter versuch, danke !!


Schau dir mal das Array thema an in meinem Blog , das sollte dir weiterhelfen.

[Scripting] Arrays / Count / forEach / set - Arma2 - Editing Blog
Anemia ist offline  
Alt 27.04.2011, 20:32   #5 (permalink)
Newbie
 
Registriert seit: 27.03.2011
Beiträge: 8
Standard

ne du, auch hier hier ist leider nichts für mich dabei... zumal es auch nicht um ein array (od. mehrere) geht... sondern um die abfrage ob x im vehicle ist !!

edit : ich habs... und dabei war's ganz einfach... hab einfach die klammern für ne operation hinzugefügt und es lübbt...

so muss es aussehen :

waituntil {tango in vipconvb && guarda in vipconva && guardb in vipconva && ({_x in vipconvc} foreach units grpescort)};

danke für die selbsthilfe... kann geclosed werden !

Geändert von *Wolf* (27.04.2011 um 21:10 Uhr).
*Wolf* ist offline  
Alt 27.04.2011, 22:33   #6 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

Edit 2:<Gelöscht. Siehe Post #8.>

Edit 1: forEach hat eigentlich keinen Rückgabewert, darum wundert es mich wenn das so geht wie in Post #5 beschrieben.

Geändert von Vienna (27.04.2011 um 23:51 Uhr).
Vienna ist offline  
Alt 27.04.2011, 22:55   #7 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Buliwyf
 
Registriert seit: 11.03.2005
Ort: HH
Alter: 53
Beiträge: 1.930
Standard

Ich hätte jetzt auch eher sowas erwartet:

Code:
waituntil {tango in vipconvb && guarda in vipconva && guardb in vipconva && ({_x in vipconvc} count units grpescort == {alive _x} count units grpescort)};
__________________
Buliwyf ist offline  
Alt 27.04.2011, 23:48   #8 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

waituntil ist sogar "besser" als call und benötigt call nicht.

forEach hat entgegen der Beischreibung in diesem Fall einen Rückgabewert. Allerdings gibt es dabei ein Problem.

1) hint format["%1", {_x in [4,3,5]} forEach [5,4,3]] -->Ergebnis = true

2) hint format["%1", {_x in [4,3,5]} forEach [5,4,2]] -->Ergebnis = false

Anscheinend ist die letzte Zahl für _x für das Ergebnis verantwortlich.

Das wirkt sich auch in waituntil gleichermaßen aus.

Edit: Folgende Abfrage ergibt auch nach 2) true:
waitUntil{_i=false;{if(_x in [4,3,5])then{_i=true}}forEach[5,4,2];_i}

Geändert von Vienna (28.04.2011 um 00:31 Uhr).
Vienna ist offline  
Alt 28.04.2011, 00:53   #9 (permalink)
10 Jahre hx3
5000 Beiträge
 
Benutzerbild von Xeno
 
Registriert seit: 03.01.2008
Alter: 84
Beiträge: 6.552
Standard

*deleted*

Xeno
__________________
In arma everything is made of refined explodium, armored with wet paper towels.

Geändert von Xeno (03.01.2014 um 09:57 Uhr).
Xeno ist offline  
Alt 28.04.2011, 11:52   #10 (permalink)
Newbie
 
Registriert seit: 27.03.2011
Beiträge: 8
Standard

hi xeno, hi vienna

bin ja mächtig erstaunt, dass ich doch eine kleine diskussion losgetreten habe...

der code läuft wie in post 5 geschrieben fehlerfrei durch und gibt die richtigen rückgabewerte zum auflösen des waituntil zurück. ich hatte auch versucht das über ne if-then-else schleife zu realisieren (hat nicht wirklich geklappt und wurde ellenlang,mag meine blödheit gewesen sein), aber die waituntil variante ist einfach (wesentlich) kürzer bei gleichem effekt ! deswegen ging es mir ja um die zusammenführung beider "abfragen"... letztendlich ist es nun aber logisch, die letzte "&&" abfrage in einer eigenen operation "()" ausführen zu lassen... hab nur den wald vor lauter bäumen nicht gesehen, arma halt...

nochma danke für die anregungen... die nächste (für mich unlösbare) frage wird kommen !!!

edit : hatte gestern auch die drei einzelpersonen noch eine gruppe joinen lassen und nun sieht die (funktionierende) syntax so aus :

waituntil {({_x in vipconva} foreach units grptango) && ({_x in vipconvc} foreach units grpescort)};

Geändert von *Wolf* (28.04.2011 um 12:00 Uhr).
*Wolf* ist offline  
Alt 28.04.2011, 13:20   #11 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

Das kann nicht korrekt funktionieren, weil von den Units immer nur die letzte Unit berücksichtigt wird.

Meiner Meinung nach sollte es korrekt so aussehen:
Code:
waituntil {_a=false;_b=false;{if(_x in vipconva)then{_a=true}}foreach units grptango;{if(_x in vipconvc)then{_b=true}}foreach units grpescort;_a && _b};
Edit: exitWith{} entfernt. Darf in waituntil nicht enthalten sein.

Geändert von Vienna (28.04.2011 um 15:26 Uhr).
Vienna ist offline  
Alt 28.04.2011, 13:37   #12 (permalink)
Newbie
 
Registriert seit: 27.03.2011
Beiträge: 8
Standard

warum kann das denn nicht korrekt funktionieren ? mein script (die eine abfrage ist ja nur ein kleines teilchen gewesen) läuft fehlerfrei durch und macht genau das was es soll, ich habe keinerlei eintrag in der rpt oder fehler durch showscripterror angezeigt bekommen... ich wüsste jetzt nicht, warum das nicht korrekt funktionieren sollte ? was heisst es wird nur die letzte unit beachtet ?

da in arma ja viele wege nach rom führen und du deinen weg für den eleganteren/korrekten weg hälst,klär mich bitte auf, damit ich ich deinen ansatz auch nachvollziehen kann... danke.

werd aber noch grad mal aus neugier deinen schnippsel testen...

rpt:
Error in expression <{if(_x in vipconva)then{_a=true;exitWith{}}}foreach units grptango;{if(_x in vip>
Error position: <{}}}foreach units grptango;{if(_x in vip>
Error Missing ;

Geändert von *Wolf* (28.04.2011 um 13:58 Uhr).
*Wolf* ist offline  
Alt 28.04.2011, 14:05   #13 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

Vergleiche im Post #8 das Ergebnis von 1) und 2).

Vom Unit-Array wird nur das Ergebnis der letzten Unit berücksichtigt. Wenn von 10 Units die vorderen 9 im Vergleichs-Array sind, die letzte 10. Unit aber nicht, dann ist das Endergebnis false, obwohl das Ergebnis bei den 9 vorherigen Units true war.

Zu meinem Beispiel: Ich kenne ja die Zusammenhänge deiner Abfrage nicht. Du musst das in kleinen Teilschritten austesten. Die zahlreichen Klammern machen die Sache recht unübersichtlich.
Vienna ist offline  
Alt 28.04.2011, 14:12   #14 (permalink)
Newbie
 
Registriert seit: 27.03.2011
Beiträge: 8
Standard

hmm... check ich grad nicht... muß ich mal austesten, vll. kapiere ich's dann... hast mich jetzt vollends verwirrt...

erklärste mir das (also {_x in [4,3,5] foreach [5,4,3]) bitte mal ? irgendwie bekomme ich das grad nicht auf die reihe... danke

1) hint format["%1", {_x in [4,3,5]} forEach [5,4,3]] -->Ergebnis = true

2) hint format["%1", {_x in [4,3,5]} forEach [5,4,2]] -->Ergebnis = false

Geändert von *Wolf* (28.04.2011 um 14:20 Uhr).
*Wolf* ist offline  
Alt 28.04.2011, 14:22   #15 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

Es ist übersichtlicher den Code in einzelne Zeilen zu unterteilen:

Code:
waituntil 
 {
  _a=false;
  _b=false;
   {if(_x in vipconva)then{_a=true}}foreach units grptango;
   {if(_x in vipconvc)then{_b=true}}foreach units grpescort;
   _a && _b
 };
In meinem Beispiel sehe ich auch so keinen Fehler. Ein ; ist vor schließenden } Klammern nicht erforderlich.

Edit: Es war doch ein Fehler! In waituntil darf exitWith{} nicht enthalten sein!!
Das wurde oben korrigiert.

Geändert von Vienna (28.04.2011 um 15:29 Uhr).
Vienna ist offline  
Alt 28.04.2011, 14:31   #16 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

Zitat von *Wolf* Beitrag anzeigen

erklärste mir das (also {_x in [4,3,5] foreach [5,4,3]) bitte mal ? irgendwie bekomme ich das grad nicht auf die reihe... danke

Im "abfragenden" Array [5,4,3] ist die letzte Zahl die 3, welche im "Vergleichsarray" [4,3,5] enthalten ist. So ist das Ergebnis true.

Ist im "abfragenden" Array [5,4,letzte Zahl] die letzte Zahl eine 2, dann ist das Ergebnis false, obwohl die vorherigen Zahlen 5 und 4 true waren.
Vienna ist offline  
Alt 29.04.2011, 12:14   #17 (permalink)
Newbie
 
Registriert seit: 27.03.2011
Beiträge: 8
Standard

Zitat von Vienna Beitrag anzeigen

Im "abfragenden" Array [5,4,3] ist die letzte Zahl die 3, welche im "Vergleichsarray" [4,3,5] enthalten ist. So ist das Ergebnis true.

soweit komme ich mit...

Zitat von Vienna Beitrag anzeigen

Ist im "abfragenden" Array [5,4,letzte Zahl] die letzte Zahl eine 2, dann ist das Ergebnis false, obwohl die vorherigen Zahlen 5 und 4 true waren.

hier nicht mehr...

wie kommst du auf diese vergleichsarrays ? wie kann ich sowas einsetzen ? das mit
Code:
hint format
alles innerhalb der
Code:
[]
ausgegeben wird, krieg ich ja noch mit... aber was wird da verglichen ? ich bekomme den vergleich in anwendung auf eben diese "gruppe" nicht auf eine höhe... wie ich ja sagte, bin noch recht neu mit der scripterei, hab mir zwar (glaub ich) viel in kurzer zeit selber angepaukt, aber jetzt komm ich an kleinere (größere) "verständnissprobleme"...

also, beim ersten vergleich komme ich wie gesagt noch mit, in beiden arrays sind die gleichen zahlen somit ist true !

bei der zweiten abfrage sind im abfragenden array [5,4,letzte Zahl]... ist die letzte zahl eine 2, ist die abfrage false, ist ja klar, weil die 3 ja nicht drinne ist... aber warum ist die 3 da jetzt nicht drinne und wie kommst du auf die zahl 2 ?

heisst das, wenn eine einheit der gruppe niedergeschossen wurde und nicht mehr mitgezählt werden kann, ist die abfrage false ? woher weiß das system denn, wieiviele eineiheiten in der gruppe waren und zum zeitpunkt der abfrage aktuell nun sind ? zählt es die mit count mit ? werd ich gleich mal testen, wenn ich daheim bin...

oh mann...

Geändert von *Wolf* (29.04.2011 um 13:03 Uhr).
*Wolf* ist offline  
Alt 29.04.2011, 14:30   #18 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

Wenn die letzte abgefragte Zahl nicht im Bereich ist, dann ist das Endergebnis false.


Hier ein leichter verständliches Beispiel:
Von den Soldaten S1, S2 und S3 einer Gruppe befinden sich S1 und S2 in einem Bereich.
Es soll mit waituntil abgefragt werden ob wenigstens einer der Soldaten im Bereich ist.

Falsche Abfrage ergibt false:
waituntil { {_x in [S1,S2]} forEach [S1,S2,S3] };

{_x=S1 in Bereich[S1,S2]} Ergebnis = true
{_x=S2 in Bereich[S1,S2]} Ergebnis = true
{_x=S3 in Bereich[S1,S2]} Ergebnis = false

Bei dieser Art der Abfrage wird als Rückgabewert das Ergebnis der letzen Abfrage genommen!

Korrekte Abfrage ergibt true:
waituntil { _a=false; { if (_x in [S1,S2]) then {_a=true} } foreach [S1,S2,S3]; _a };

Bei der falschen Abfrage kann auch das richtige Ergebnis rauskommen, aber nicht immer.
Vienna ist offline  
 


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
sleep befehl miromanu Editing & Scripting 10 11.09.2010 01:26
switchLight befehl miromanu Editing & Scripting 5 20.08.2010 05:15
Befehl für Laser an Waffe Spiderman Editing & Scripting 4 21.07.2010 23:22


Kontakt - HX3.de - Archiv - Nach oben

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 117 118 119