Armed-Assault.de Twitter


Editing The world is a Script - write it!

Antwort
 
Themen-Optionen Ansicht
Alt 09.07.2008, 00:13   #1 (permalink)
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von Cyborg11
 
Registriert seit: 26.03.2008
Beiträge: 2.822
Standard 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"];}
Nur ich krieg die zweite Abfrage nicht rein. Es soll zusätzlich (nur bei den angegeben Waffen) abgefragt werden, ob acv auf 0 ist. Wenn dies der Fall ist, soll ein Text erscheinen: "Sie müssen sich zuerst ein ACOG-Zielfernrohr besorgen, um die Waffe damit aufzurüsten." Wenn sie auf 1 ist, dann soll das ganze ganz normal ausgeführt werden.

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."}
Ich hoffe ihr könnt mir hier weiterhelfen
Cyborg11 ist offline   Mit Zitat antworten
Alt 09.07.2008, 21:55   #2 (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

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.
Vienna ist offline   Mit Zitat antworten
Alt 09.07.2008, 22:07   #3 (permalink)
50 Beiträge100 Beiträge250 Beiträge
 
Benutzerbild von pspsps91
 
Registriert seit: 22.12.2005
Beiträge: 323
Standard

Zitat:

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."};

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...
pspsps91 ist offline   Mit Zitat antworten
Alt 10.07.2008, 17:25   #4 (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 überhaupt nur eine Reaktion erfolgen soll, wenn der Spieler eine der Waffen hat, dann kann das so gelöst werden:

If (Waffe1 OR Waffe2 OR ... ) then { if (acv==1) then {Aktion} else {Meldung} };
Vienna ist offline   Mit Zitat antworten
Alt 10.07.2008, 19:46   #5 (permalink)
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von Cyborg11
 
Registriert seit: 26.03.2008
Beiträge: 2.822
Standard

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."}}
Funktioniert auch so alles Trotzdem danke nochmal an euch für den Tipp mit dem else. Dass ich da nicht selber draufgekommen bin
Cyborg11 ist offline   Mit Zitat antworten
Alt 10.07.2008, 22:07   #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

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}
Vienna ist offline   Mit Zitat antworten
Alt 11.07.2008, 11:16   #7 (permalink)
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von Cyborg11
 
Registriert seit: 26.03.2008
Beiträge: 2.822
Standard

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^^
Cyborg11 ist offline   Mit Zitat antworten
Alt 11.07.2008, 13:11   #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

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.
Vienna ist offline   Mit Zitat antworten
Alt 11.07.2008, 13:30   #9 (permalink)
50 Beiträge100 Beiträge250 Beiträge
 
Benutzerbild von pspsps91
 
Registriert seit: 22.12.2005
Beiträge: 323
Standard

Zitat:

Die Abfrage im Else-Teil ist überflüssig!

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}
Angenommen der Spieler hat als Waffe ein Pistole( "m9" ). Außerdem hat er den Gegenstand bereits aufgesammelt ( acv=1 ). Jetzt kommt deine Abfrage:
_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...
pspsps91 ist offline   Mit Zitat antworten
Alt 11.07.2008, 14:06   #10 (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

Für diesen Fall habe ich die Abfrage schon in Post #8 korrigiert.
Vienna ist offline   Mit Zitat antworten
Alt 12.07.2008, 12:08   #11 (permalink)
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von Cyborg11
 
Registriert seit: 26.03.2008
Beiträge: 2.822
Standard

So wäre es leichter, aber ich hab kein Bock meine Skripte umzuschreiben ^^ Vllt. wenn ich mal Zeit hab.

Trotzdem danke Das werde ich mir merken
Cyborg11 ist offline   Mit Zitat antworten
Alt 12.07.2008, 12:42   #12 (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 du dich weiterhin mit Programmieren befassen willst, dann mußt du dir diese Tugend angewöhnen. Sonst wirst du keine Freude damit haben.
Vienna ist offline   Mit Zitat antworten
Alt 12.07.2008, 13:01   #13 (permalink)
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von Cyborg11
 
Registriert seit: 26.03.2008
Beiträge: 2.822
Standard

Zitat von Vienna Beitrag anzeigen

Wenn du dich weiterhin mit Programmieren befassen willst, dann mußt du dir diese Tugend angewöhnen. Sonst wirst du keine Freude damit haben.

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?
Cyborg11 ist offline   Mit Zitat antworten
Alt 12.07.2008, 13:23   #14 (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

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.
Angehängte Dateien
Dateityp: zip Bewaffnung_anzeigen.zip (1,2 KB, 24x aufgerufen)
Vienna ist offline   Mit Zitat antworten
Alt 12.07.2008, 13:27   #15 (permalink)
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von Cyborg11
 
Registriert seit: 26.03.2008
Beiträge: 2.822
Standard

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?
Cyborg11 ist offline   Mit Zitat antworten
Alt 12.07.2008, 15:04   #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

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.
Vienna ist offline   Mit Zitat antworten
Alt 12.07.2008, 16:13   #17 (permalink)
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von Cyborg11
 
Registriert seit: 26.03.2008
Beiträge: 2.822
Standard

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 welches Skript muss da dann ausgeführt werden? Das Skript wo ich dann die Raketen auswähle (Beispiel) oder das Skript, indem ich die Raketen zuweise?

Oder kannst du mir bitte am Besten mal ein Skript an einer Beispielrakete (Maverick -> Hellfire) zeigen? =)
Cyborg11 ist offline   Mit Zitat antworten
Alt 12.07.2008, 16:40   #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

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.
Vienna ist offline   Mit Zitat antworten
Alt 12.07.2008, 17:07   #19 (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

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
Das ist nicht getestet. Ich hoffe ich habe die Befehle richtig geschrieben.
-
-
Vienna ist offline   Mit Zitat antworten
Alt 12.07.2008, 21:44   #20 (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

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.
Vienna ist offline   Mit Zitat antworten
Antwort


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
Senden an - Funktion nicht mehr sichtbar Lee-on Hilfe 7 23.09.2005 18:20
"Eject" funktion auf einer Taste Lee-on Hilfe 7 10.06.2005 20:05
[EXCEL] Wahrheitsprüfung (Wenn Funktion) Kompost Hilfe 6 28.09.2004 21:52


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