![]() |
#1 (permalink) |
![]() Registriert seit: 27.03.2011
Beiträge: 8
|
![]()
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}; Code:
waituntil {tango in vipconvb && guarda in vipconva && guardb in vipconva}; 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). |
![]() |
![]() |
#2 (permalink) |
![]() ![]() ![]() ![]() Registriert seit: 13.04.2003
Ort: Monerica
Alter: 42
Beiträge: 32.984
|
![]() 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; }; Weiss jetzt auch nicht ob er nach dem 1. else überhauptnochmal zurck zur 1. Abfrage geht .. ![]() |
![]() |
![]() |
#3 (permalink) |
![]() Registriert seit: 27.03.2011
Beiträge: 8
|
![]()
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). |
![]() |
![]() |
#4 (permalink) |
![]() Registriert seit: 20.05.2009
Beiträge: 605
|
![]()
Schau dir mal das Array thema an in meinem Blog , das sollte dir weiterhelfen. [Scripting] Arrays / Count / forEach / set - Arma2 - Editing Blog |
![]() |
![]() |
#5 (permalink) |
![]() Registriert seit: 27.03.2011
Beiträge: 8
|
![]()
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). |
![]() |
![]() |
#8 (permalink) |
![]() ![]() ![]() ![]() Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
![]()
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). |
![]() |
![]() |
#10 (permalink) |
![]() Registriert seit: 27.03.2011
Beiträge: 8
|
![]()
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). |
![]() |
![]() |
#11 (permalink) |
![]() ![]() ![]() ![]() Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
![]()
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}; Geändert von Vienna (28.04.2011 um 15:26 Uhr). |
![]() |
![]() |
#12 (permalink) |
![]() Registriert seit: 27.03.2011
Beiträge: 8
|
![]()
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). |
![]() |
![]() |
#13 (permalink) |
![]() ![]() ![]() ![]() Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
![]()
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. |
![]() |
![]() |
#14 (permalink) |
![]() Registriert seit: 27.03.2011
Beiträge: 8
|
![]()
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). |
![]() |
![]() |
#15 (permalink) |
![]() ![]() ![]() ![]() Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
![]()
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 }; 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). |
![]() |
![]() |
#16 (permalink) |
![]() ![]() ![]() ![]() Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
![]() 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. |
![]() |
![]() |
#17 (permalink) |
![]() Registriert seit: 27.03.2011
Beiträge: 8
|
![]() soweit komme ich mit... hier nicht mehr... wie kommst du auf diese vergleichsarrays ? wie kann ich sowas einsetzen ? das mit Code:
hint format Code:
[] 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). |
![]() |
![]() |
#18 (permalink) |
![]() ![]() ![]() ![]() Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
![]()
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. |
![]() |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
Themen-Optionen | |
Ansicht | |
|
|
![]() |
||||
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 |