PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bedingung - Nur bestimmte Klasse


MagicStyle
09.08.2013, 21:49
Nabend Community,

Ich sitze hier schon seit ner Stunde am selbem Problem und komme keinen Meter weiter. :( Vielleicht hat der ein oder andere hier Lust mir zu helfen. Wie der Titel schon sagt, versuche ich eine Bedingung zu erstellen, die nur dann wahr wird, wenn eine bestimmte Klasse den Auslöser betritt z.B. "USMC_SOLDIER".

http://picload.org/image/odiardp/arma2.png

Ich habe es auch schon teilweise geschafft, jedoch nur soweit, das die Bedingung nur für mich als Spieler zutrifft. Die KI wird leider nicht berücksichtigt... ich möchte das eine Aktion ausgeführt wird, sobald irgendeine Einheit der Klasse "USMC_SOLDIER" den Auslöser betritt, egal ob KI oder Spieler.

:archi: Frage: Was muss ich im Code ...this and typeOf player isKindOf "USMC_SOLDIER";...anstatt player als Objekt angeben damit mein Vorhaben entlich erfolgreich sein wird? Vielleicht kann mir ja jemand helfen :)

Danke im Vorraus für jede Hilfe! :)

Gruß M.S.

PS: Die KI ist natürlich ebenfalls vom Typ "USMC_SOLDIER". Vielleicht ist jemanden schon aufgefallen das ich im Bild einen Offizier verwendet habe, nur um vorzugreifen, mir ist bewusst das dieser eine andere Klasse hat ;) Vielleicht ist euch auch aufgefallen das im Auslöser rechts im Bild "Obj Nul" steht, das war eine experiment, wurde anscheinend nicht rechtzeitig aktualisiert, sorry.

Moerderhoschi
10.08.2013, 00:47
Probier mal ob folgendes fuer dich hinhaut.

http://abload.de/img/arma2oa2013-08-1001-4jru2y.jpg


Condition:
call {_b = false; {if (typeof _x == "USMC_SOLDIER") then {_b = true}} foreach thislist; _b }

On Act:
{if (typeof _x == "USMC_SOLDIER") then {_x setdamage 1}} foreach thislist



gruß
hoschi

MagicStyle
10.08.2013, 11:20
Morgen! Es funktioniert bestens :) , danke sehr für deine Hilfe :daumen:

Ich habe aber leider noch einige Fragen zum Quellcode, vielleicht kann mir jemand helfen.

call {_b = false; {if (typeof _x == "USMC_SOLDIER") then {_b = true}} foreach thislist; _b }
Ich habe nicht verstanden weshalb am Ende der ersten Codezeile _b steht? Wozu wird es dort benötigt?

Ich würde außerdem gerne verstehen was es mit dem "thislist" bei der ForEach Schleife auf sich hat. Anscheinend ist dies eine Liste mit allen Einheiten auf der gesamten Map wenn ich richtig liege?

Hoffe das wir diese beiden Fragen auch noch geklärt bekommen.

Danke im Vorraus :)

Gruß M.S.

Moerderhoschi
10.08.2013, 13:56
call {_b = false; {if (typeof _x == "USMC_SOLDIER") then {_b = true}} foreach thislist; _b }

_b ist eine lokale Variable innherhalb der Funktion {} der am Anfang der boolsche Wert false zugewiesen wird.

Ist die Bedingung (typeof _x == "USMC_SOLDIER") wahr so wird die lokale Variable _b auf true gesetzt und am ende der Funktion true zurueckgegeben da die Condition des Trigger einen boolschen Wert erwartet.

Thislist ist ein Array der alle zutreffenden Einheiten die sich im Triggerbereich befinden und der eingestellten Seite entsprechen enthaelt.

foreach arbeitet einen Array ab der ja durch thislist im Trigger bereitgestellt wird.


Mit call {_b = false; {if (typeof _x == "USMC_SOLDIER") then {_b = true}} foreach thislist; _b }

wird also zuerst die lokale Variable, nur gueltig in den {}, auf false gesetzt.

Dannach wird eine Abfrage aller Einheiten im Triggerbereich, bedingt durch {} foreach thislist, durchgefuehrt.

Diese Abfrage die ja also nun fuer jede Einheit im Triggerbereich mit der eingestellten Seite entsprechend durchgefuehrt wird ist also if (typeof _x == "USMC_SOLDIER") then {_b = true} wobei _x hier der Platzhalter fuer das jeweilige Element/Einheit im Array ist.

Sollte also mindestens eine Einheit oder mehrere Einheiten im Array Thislist den Typ "USMC_Soldier" haben so wird die lokale Variable _b auf true gesetzt und der Trigger fuehrt anschließend das aus was in On act: steht.

{if (typeof _x == "USMC_SOLDIER") then {_x setdamage 1}} foreach thislist

Dort wird der Array der durch thislist nocheinmal erstellt wird wieder abgearbeitet und diesmal wird eben nicht eine lokale variable _b auf true gesetzt sondern die Einheiten die dem Typ "USMC_SOLDIER" entsprechen einen Damagewert von 1 gegeben. Dies gilt fuer alle Einheiten im Array mit dem Typ "USMC_SOLDIER"

Das ist das was in dem Trigger passiert. Hoffe meine Darstellung der Vorgaenge war fuer dich nachvollziebar.

gruß
hoschi

MagicStyle
10.08.2013, 15:35
Hat mir sehr geholfen !! :daumen: Es freut mich wirklich sehr das du dir die Zeit genommen hast mir zu helfen den Quellcode zu verstehen, vielen Dank :)

Ich habe gleich mal ein neues kleines Beispiel erstellt um herauszufinden ob ich es jetzt wirklich zu 100% kapiert habe.
Für das Beispiel lasse ich eine gesamte Truppe (20 Mann) durch einen Auslöser laufen und möchte das mir bei jedem einzelnem der Klassenname ausgegeben wird.

Der Auslöser ist wie folgt konfiguriert:
Auslöseart: Mehrfach
Aktivierung: Jeder
Bedinung: this
Bei Aktivierung:
{ player globalChat format["Soldat ist von der Klasse : %1", typeOf _x] } forEach thislist;

Leider erscheint nur eine einzige Ausgabe, es wird immernur der Klassenname der Einheit angezeigt die als erstes durch den Auslöser läuft, die anderen aktivieren den Auslöser scheinbar garnicht mehr?
Liegt es an der Bedinung, oder daran das der Soldat zu diesem Zeitpunkt der einzige in der Liste (bzw. im Array) ist, da er ja der erste ist der den Auslöser betritt ? :nachdenklich:

Tut mir leid dass ich schon wieder damit nerven muss :/

Gruß M.S.

Moerderhoschi
10.08.2013, 15:59
Das liegt daran das der Ausloeser nur beim ersten Soldaten der den Trigger betritt ausgeloest wird. Die Bedingung ist this, das bedeutet soblad eine einheit egal von welcher Seite den Trigger betritt ist die Bedingung true und das was in On act: steht wird ausgefuehrt. Erst wenn die Bedingung auf false geht d.h. keine einheiten mehr im trigger sind wird das was in On deact: steht ausgefuehrt. Wenn dann wieder eine Einheit in den Trigger laeuft faengt es wieder von vorne an.

Um dein ziel zu erreichen musst du die condtition abaendern. Probier es mal mit folgendem:


this && {ceil time % 2 != 0}


somit aendert sich die condition wenn einheiten im trigge sind jede sekunde und der on act part wird immer wieder ausgefuehrt

gruß
hoschi

MagicStyle
10.08.2013, 16:34
Ahh, verstehe :)! Klingt logisch!

Habe den Code in die Bedinung eingefügt, leider wird jedoch folgendes in einem Pop-Up Fenster ausgegeben:

" &&: Typ Jede, erwartet Bool"

http://www10.pic-upload.de/thumb/10.08.13/tqcqfzsydwyr.png (http://www.pic-upload.de/view-20362054/ArmaII.png.html)

gruß M.S.

Moerderhoschi
10.08.2013, 16:50
Ah ja, ArmA II alone kennt kein lazy eval. Schreibe statdessen folgendes

this && (ceil time % 2 != 0)

gruß
hoschi

MagicStyle
10.08.2013, 16:54
Super, jetzt funktioniert es einwandfrei :) THX :daumen:

Habe noch eine Frage zum ceil, kannst du mir sagen wozu das %2 ist, wo kann ich mich da informieren? Hat es was mit Moduloberechnung zu tun?

PS: Im Bild auf das ich im letzten Post verlinkt habe muss man noch auf "Mehrfach" stellen, hatte ich beim neu erstellen vergessen.

Moerderhoschi
10.08.2013, 17:00
Ceil und Floor sind ab und aufrundungsfunktionen. % ist wie Du schon richtig erkannt hast Modulo Arithmetic Operators (http://community.bistudio.com/wiki/Operators#Arithmetic_Operators) - Klick auf das ArmA Wiki Bild in meiner Signatur um ins ArmA Wiki zu gelangen oder hier ein direktlink zu allen gueltigen ArmA II befehlen: http://community.bistudio.com/wiki/Category:Scripting_Commands_ArmA2

gruß
hoschi

MagicStyle
10.08.2013, 17:04
Sehr gut, dann sind nun alle Fragen geklärt. Ich bedanke mich erneut für deine Hilfe!! THX ! ! !

Gruß
M.S.