09.07.2008, 01:13 | #1 (permalink) |
Registriert seit: 26.03.2008
Beiträge: 2.822
|
Verschachtelte If-Funktion
Hallo Leute,
ich melde mich mal wieder, weil ich ein Problem mit meinem Skript habe ^^ Ich will eine verschachtelte If-Funktion. Zuerst soll abgefragt werden, ob der Spieler die Waffen besitzt und dann soll überprüft werden, ob die Variable den Wert 1 hat. Wenn die Variable aber 0 hat, soll ein Text kommen, dass man sich zuerst den Gegenstand holen muss. So schaut die Zeile atm bei mir aus: Code:
If (player hasweapon "M16A4" AND acv==1 OR player hasweapon "M16A4_GL" AND acv==1 OR player hasweapon "M16A4_ACG" AND acv==1 OR player hasweapon "M16A4_ACG_GL" AND acv==1) then {m16acgas = player addaction ["--ACOG aufsetzen", "acg.sqs"];} Hätte schon eine Idee für die zweite Abfrage, aber wie gesagt, bekomme ich die nicht in meine Zeile mit rein =( Code:
If (acv==0) then {hint "Sie müssen sich zuerst ein ACOG-Zielfernrohr besorgen, um die Waffe damit aufzurüsten."} |
09.07.2008, 22:55 | #2 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
if ( (player hasweapon "M16A4" OR player hasweapon "M16A4_GL" OR player hasweapon "M16A4_ACG" OR player hasweapon "M16A4_ACG_GL") AND acv==1 ) then {m16acgas = player addaction ["--ACOG aufsetzen", "acg.sqs"]} else {hint "Sie müssen sich zuerst ein ACOG-Zielfernrohr besorgen, um die Waffe damit aufzurüsten."};
Zum besseren Verständnis: In der Klammer wird zuerst abgefragt, ob der Spieler eine der Waffen hat. Danach wird abgefragt ob auch die Variable acv==1 ist. w = wahr, f = falsch If ( (w/f OR w/f OR ... ) AND w/f ) then { * } else { ** }; * Ausführung wenn eines in der Klammer und der Variablewert zutreffen. ** Ausführung wenn nichts in der Klammer oder der Variablewert nicht zutrifft. |
09.07.2008, 23:07 | #3 (permalink) |
Registriert seit: 22.12.2005
Beiträge: 323
|
Da ist ein Denkfehler drinne! Wenn acv==1 Wahr ist, der Spieler aber keine passende Waffe hat kommt trotzdem die Meldung! Man sollte da wohl eher im Else-Teil eine zweite Abfrage einbauen: Code:
if ( (player hasweapon "M16A4" OR player hasweapon "M16A4_GL" OR player hasweapon "M16A4_ACG" OR player hasweapon "M16A4_ACG_GL") AND acv==1 ) then {m16acgas = player addaction ["--ACOG aufsetzen", "acg.sqs"]} else {if(acv==0)then{hint "bla bla bla!"}};
__________________
SP Mission, coming soon... |
10.07.2008, 20:46 | #5 (permalink) |
Registriert seit: 26.03.2008
Beiträge: 2.822
|
Danke Jungs HAb das jetzt so ähnlich gelöst. Hier mal meine neue Skriptzeile:
Code:
If ((player hasweapon "M16A4" OR player hasweapon "M16A4_GL" OR player hasweapon "M16A4_ACG" OR player hasweapon "M16A4_ACG_GL") AND (acv>0)) then {m16acgas = player addaction ["--ACOG aufsetzen", "acg.sqs"];} else {If (player hasweapon "M16A4" OR player hasweapon "M16A4_GL" OR player hasweapon "M16A4_ACG" OR player hasweapon "M16A4_ACG_GL") then {hint "Sie benötigen einen Granatwerfer oder ein ACOG-Zielfernrohr, um ihre Waffe aufzuruesten."}} |
10.07.2008, 23:07 | #6 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Die Abfrage im Else-Teil ist überflüssig!
Um das übersichtlicher zu gestalten kannst du es so programmieren: _waffeP = weapons player select 0 _waffen = ["M16A4","M16A4_GL","M16A4_ACG","M16A4_ACG_GL"] if ( _waffeP IN _waffen AND acv==1 ) then {Aktion} else {Meldung} |
11.07.2008, 12:16 | #7 (permalink) |
Registriert seit: 26.03.2008
Beiträge: 2.822
|
Ne, die ist NICHT überflüssig. Ich hab ja mehrere Waffen, wo man verschiedene Sachen aufrüsten kann. Und wenn ich jetzt eine andere Waffe habe, aber die acv==0 ist, dann kommt aber ide Meldung von der anderen Waffe
Hoffe du versteht was ich meine Und ich weiß, dass ich es etwas kompliziert gemacht habe, aber warum jetzt umändern, wenn ich noch durchblicke und ich hab auch kein Bock meine Skripte wieder umzuschreiben^^ |
11.07.2008, 14:11 | #8 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Das stimmt! Dann solltest du die Abfrage so durchführen:
_waffeP = weapons player select 0 _waffen = ["M16A4","M16A4_GL","M16A4_ACG","M16A4_ACG_GL"] if ( _waffeP IN _waffen ) then { if (acv==1) then {Aktion} else {Meldung} } Du musst vermeiden, eine gleiche Abfrage mehrmals auszuführen. Auch musst du beim Programmieren bedacht sein, die Programmzeilen übersichtlich zu gestalten, damit du auch später noch den Durchblick hast wie alles abläuft. So kannst du deine Zeilen auch als Vorlage für weitere Anwendungen verwenden. Dann ist es in übersichtlicher Schreibweise leichter und weniger fehleranflällig z.B. eine weitere Waffe hinzuzufügen. Ebenfalls ist es wichtig, die Skripte mit Kommentaren zu versehen. In .sqs Skripts beginnend mit ; und bei .sqf mit //. Wobei du aber vorerst bei der .sqs Syntax bleiben solltest, weil .sqf heikler ist. |
11.07.2008, 14:30 | #9 (permalink) |
Registriert seit: 22.12.2005
Beiträge: 323
|
FALSCH!! Code:
_waffeP = weapons player select 0 _waffen = ["M16A4","M16A4_GL","M16A4_ACG","M16A4_ACG_GL"] if ( _waffeP IN _waffen AND acv==1 ) then {Aktion} else {Meldung} _waffeP IN _waffen ergibt FALSCH acv==1 ergibt WAHR und der Gesamte Ausdruck wäre dadurch FALSCH -> Der Elseteil wird ausgeführt, es wird dem Spieler angezeigt, er muss erst den Gegenstand einsammeln, obwohl er ihn bereits hat!
__________________
SP Mission, coming soon... |
12.07.2008, 14:01 | #13 (permalink) |
Registriert seit: 26.03.2008
Beiträge: 2.822
|
Ok, werde ich dann machen Hab jetzt vor zu basteln, dass ich im Hangar vom Flughafen die Bewaffnung der A10 wählen kann. Versuche das eigentlich wieder ganz genauso wie die Aufrüstungen der Waffen Ich hab aber ka, wie ich das Skript gestalten könnte, damit ich nicht wieder über 30 Skripte danach habe ^^ Ich will z.b., dass der Spieler zuerst den Menüpunkt "Bewaffnung wählen" auswählt und danach kommen dann "Rakete auswählen", "MG auswählen", "Bomben auswählen". So nun will ich aber, dass wenn ich eine neue Rakete auswähle (Maverick), meine alte Rakete (Hellfire z.b.) verschwindet. Und so soll das dann mit allen Waffen sein. Hättest du vllt. eien Idee wie ich dsa mit minimalsten Aufwand schaffen könnte? |
12.07.2008, 14:23 | #14 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Dazu würdest du ein Dialog-Menü benötigen. Das ist sehr kompliziert zu erstellen.
Einfacher ist, du bindest an einen Gegenstand (den du im Hangar aufstellst) eine Reihe von Aktionen, mit denen du für das Flugzeug verschiedene Bewaffnungsarten auswählen kannst. So viele Kombinationsmöglichkeiten gibt es ja nicht. Die Mission im Anhang ermöglicht es dir, die Bezeichnungen der Waffenbestückung des Spielers, oder der Fahr-/Flugzeuge anzuzeigen in die er eingestiegen ist. Wenn du bei der Bewaffnung Änderungen durchführst, immer die Magazine vor der Waffe anführen. |
12.07.2008, 14:27 | #15 (permalink) |
Registriert seit: 26.03.2008
Beiträge: 2.822
|
Ja, ich hatte es auch schon so mit den Aktionen vor. Entweder per Auslöser dann die Aktionen der A10 geben oder die Aktionen an ein Objekt binden. Mal gucken wie ich das mache.
Aber weißt du ungefähr wie ich das machen könnte, dass ich nicht für jede Raketenänderung (Hellfire -> Maverick) ein Skript brauche? Weil wenn ich dann ne AA-Rakete habe und die mit der Maverick wechseln möchte, brauch ich ja schon wieder ein Skript. Kann man das ganze mit den Raketen nicht zusammen in ein Skript fassen? Also dass dann immer die Rakete entfernt wird, die der Spieler hat und die neue Rakete wird hinzugefügt? |
12.07.2008, 16:04 | #16 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Das ist mit einem Skript möglich!
In addAction kannst du bei "arguments" ein Array mit beliebig vielen Parametern angeben. So ist es möglich, dass gleiche Skript mit verschiedenen Einstellungen aufzurufen. So kannst du dort z.B. die Waffennamen anführen, mit welchen du ausrüsten willst. z.B. [ ["Waffenname","Magazinname",Anzahl der Magazine],["Waffenname","Magazinname",Anzahl der Magazine], ....] Im Skript dann herausholen mit _Bewaffnung_1 = _this select 0; _Bewaffnung-2 = _this select 1; ... ... _NameWaffe_1 = _Bewaffnung_1 select 0; _NameMagazin_1 = _Bewaffnung_1 select 1; _MagazinAnzahl_1 = _Bewaffnung_1 select 2; _NameWaffe_2 = _Bewaffnung_2 select 0; _NameMagazin_2 = _Bewaffnung_2 select 1; _MagazinAnzahl_2 = _Bewaffnung_2 select 2; ... ... Syntax: ActionNumber = Unit addAction ["title", "filename", [arguments], priority, showWindow, hideOnUse, "shortcut"] Parameters:Unit: Person or Vehicle title: String - The action name which is displayed in the action menu. filename: String - Path to the script that is called when the action is activated. Relative to the mission folder. arguments: Anything - Arguments to pass to the script (will be (_this select 3) for the script) priority: Number - Priority value of the action. Actions will be arranged descending according to this. Every game action has a preset priority value. Value can be negative. Actions with same values will be arranged in order which they were made, newest at the bottom. showWindow: Boolean - If set True; players see "Titletext". At mid-lower screen, as they approach the object. False turns it off. hideOnUse: Boolean - If set to true, it will hide the action menu after selecting that action. If set to false, it will leave the action menu open and visible after selecting that action, leaving the same action highlighted, for the purpose of allowing you to reselect that same action quickly, or to select another action. |
12.07.2008, 17:13 | #17 (permalink) |
Registriert seit: 26.03.2008
Beiträge: 2.822
|
Also würde es dann z.b. so ausschauen:
Code:
_Bewaffnung_1 = _this select 0; _Bewaffnung_2 = _this select 1; _NameWaffe_1 = _Bewaffnung_1 select 0; _NameMagazin_1 = _Bewaffnung_1 select 1; _MagazinAnzahl_1 = _Bewaffnung_1 select 2; _NameWaffe_2 = _Bewaffnung_2 select 0; _NameMagazin_2 = _Bewaffnung_2 select 1; _MagazinAnzahl_2 = _Bewaffnung_2 select 2; Rakete = test addaction ["Rakete auswählen", "rakete.sqs", [_NameWaffe_1, _NameMagazin_1, _MagazinAnzahl1]] Oder kannst du mir bitte am Besten mal ein Skript an einer Beispielrakete (Maverick -> Hellfire) zeigen? =) |
12.07.2008, 17:40 | #18 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Der AddAction-Teil gehört in den Gegenstand dem die Auswahlaktionen hinzugefügt werden.
Das kann in der Initialisierungszeile des Gegenstandes erfolgen. z.B. für eine Aktion: ID = this addAction ["Bewaffnung 1", "Bewaffnen.sqs", [ ["Waffenname", "Magazinname", Anzahl der Magazine],["Waffenname", "Magazinname", Anzahl der Magazine], ....],1,false,false, ""] Aber weil es mehrere Aktionen sein werden, ist es auch besser die Aktionen mit einem eigenen Skript in den Gegenstand zu laden. Dieses Skript rufst du dann in der Initialisierungszeile auf. Wenn es dir leichter fällt, dann kannst du mehrere Gegenstände nehmen und jedem nur eine Aktion eintragen. Nun zum Skript "Bewaffnen.sqs" Das eigentliche Bewaffnungsskript wird über die in obigem Gegenstand hinzugefügten Aktionen aufgerufen. Die Parameterauslesung erfolgt dann in diesem Skript. |
12.07.2008, 18:07 | #19 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Wie du die Aktion in einen Gegenstand hinzufügst habe ich oben schon beschrieben.
Zur weiteren Vereinfachung ein Beispiel für das Skript "Bewaffnen.sqs" für die Aufnahme von 2 Waffen. Das zu bewaffnende Flugzeug soll den Namen Flieger1 haben! Bewaffnen.sqs Code:
_unit = Flieger1 _i=0 _Bewaffnung_1 = _this select 0 _Bewaffnung_2 = _this select 1 _NameWaffe_1 = _Bewaffnung_1 select 0 _NameMagazin_1 = _Bewaffnung_1 select 1 _MagazinAnzahl_1 = _Bewaffnung_1 select 2 _NameWaffe_2 = _Bewaffnung_2 select 0 _NameMagazin_2 = _Bewaffnung_2 select 1 _MagazinAnzahl_2 = _Bewaffnung_2 select 2 removeAllWeapons _unit for [{_i=0},{_i <= _MagazinAnzahl_1},{_i=_i+1}] do {_unit addMagazine _NameMagazin_1} _unit addWeapon _NameWaffe_1 for [{_i=0},{_i <= _MagazinAnzahl_2},{_i=_i+1}] do {_unit addMagazine _NameMagazin_2} _unit addWeapon _NameWaffe_2 - - |
12.07.2008, 22:44 | #20 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Laß dir Zeit. So einfach geht das nicht.
Anstelle von _this mußt du zuerst das Array laden: _liste = _this select 3 Die oben vorhandenen _this mußt du durch _liste ersetzen Auch entfernt removeAllWeapons die Waffen nicht. |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
Themen-Optionen | |
Ansicht | |
|
|
Ähnliche Themen | ||||
Thema | Autor | Forum | Antworten | Letzter Beitrag |
Senden an - Funktion nicht mehr sichtbar | Lee-on | Hilfe | 7 | 23.09.2005 19:20 |
"Eject" funktion auf einer Taste | Lee-on | Hilfe | 7 | 10.06.2005 21:05 |
[EXCEL] Wahrheitsprüfung (Wenn Funktion) | Kompost | Hilfe | 6 | 28.09.2004 22:52 |