PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Lokale Variabel in String?


TheRhisd
15.02.2013, 20:27
Hallo zusammen,

ich hab mal eine Frage (vielleicht eine dumme) an euch:
Geht es, dass man den Inhalt einer lokalen Variabeln in einem String wiedergibt?
Beispiel:
Ich habe den Namen einer Einheit (KI) ausgelesen,

_unitname = vehicleVarName _unit;
hab einen Trigger (per Skript) erstellt (der Funktioniert auch :ugly:)
und will diesem nun als Bedingung hinzufügen, dass oben ausgelesene Einheit am leben ist:

_trg1 setTriggerStatements ["this && alive /*Hier irgendwie den Inhalt aus _unitname einfügen */", "CODE'", "CODE"];
Ohne die Abfrage, ob die Einheit noch am Leben ist, funktioniert auch alles gut... Nur weiß ich nicht wie ich den Namen einfügen soll, ohne dass es eine Konstante ist.

Muss man überhaupt den Namen der Einheit auslesen oder kann man auch mit dem Inhalt aus _unit was anfangen (Falls die Einheit keinen Namen hat o.ä.)?

Vielen Dank schonmal an alle, die sich mit meinem Problem beschäftigen :)

Lester
15.02.2013, 21:08
hint str(_meinevariable);
player sidechat str(_meinevariable);
...
sicherer ist aber sowas:
hint str([_meinevariable]);
Der gibt dann nämlich bei ner null variable auch etwas aus ;)

TheRhisd
15.02.2013, 21:31
Danke für dein Bemühen aber leider will ich den Namen/Einheitenbezeichnung nicht ausgeben lassen, sondern von meinem Skript in den String "schreiben", sodass man das Skript universell anwenden kann, ohne jedesmal etwas daran zu ändern...
Weißt du, oder jemand anderes, wie man einen konstanten String mit dem Namen (also dem Inhalt der Variabel) "zusammenschweißt" , um diesen dann in eine Variabel zu schreiben, die man dann an den Trigger übergibt? Etwas verwirrend die Frage aber ich hoffe ihr wisst was ich meine...

Edit: Das Ganze am Besten, ohne etwas in der description.ext zu änder/reinschreiben/definieren.
Hab das probiert aber leider nicht hinbekommen :(

Vienna
15.02.2013, 21:36
_unit enthält die Identifikation des Objekts (hier die Einheit). Die Abfrage lautet somit this && alive _unit, weil alive ein Objekt benötigt, nicht einen String.


vehicleVarName gibt den Identifikations-Namen als String zurück, den du dem Objekt im Editor gegeben hast. Eine Verwendung dieses Strings macht nur Sinn, wenn du einen Code als String erstellen willst, der dann mit call compile ausgeführt wird.

Beispiel für das Zusammenstellen eines Codes als String und anschließender Ausführung mit call compile:

Die Figur des Spielers hat im Editor den Namen Soldat1 erhalten.

_code = format ["if (alive %1) then {hint 'Hallo %1!'}", vehicleVarName player];
call compile _code;

Es wird der Text Hallo Soldat1! angezeigt, wenn dieser lebt.

Den Code-Text von _code kannst du dir z.B. mit hint _code; anzeigen lassen.

TheRhisd
15.02.2013, 21:45
Das Problem ist, dass ich die Abfrage in meinem Skript nicht so lassen kann, da in dem Skript ein neuer Trigger generiert wird, und dieser dann die lokale Variable aus dem Skript in der Bedingung hat -> Resultat: Trigger wird nicht ausgelöst... :(
Globale Variabeln würde ich gerne vermeiden, da das Skript auch mehrfach laufen sollte, ohne die Einheiten eines der anderen Skripte zu beeinflussen.

Vienna
15.02.2013, 21:56
Erstelle deine Code-Zeile als String und rufe sie dann wie oben beschrieben auf.

_code = format["_trg1 setTriggerStatements [this && alive %1, ..., ...]",vehicleVarName _unit];

Beachte, dass Strings im Code-Text mit einfachen Anführungszeichen anzuführen sind.

Korrekte Lösung ab Post #14!

TheRhisd
15.02.2013, 22:05
Danke genau so etwas habe ich gesucht ;)
Ich werd das Ganze dann mal jetzt testen.
Vielen Dank für die Hilfe :)

Vienna
15.02.2013, 22:11
Kann sein, dass der Code-Text so aussehen muss:

_code = format["%1 setTriggerStatements [this && alive %2, ..., ...]",_trg1,vehicleVarName _unit];

Korrekte Lösung ab Post #14!

TheRhisd
15.02.2013, 22:36
Ich habe grade versucht das Script mit der von dir genannten Lösung zu gestalten, was allerdings nicht funktioniert hat. :komisch:
-ShowScriptErrors hat mir auch Fehlermeldungen ausgegeben, nur leider weiß ich nicht genau was ich tuen soll...
Ich habe die Fehlermeldungen in den Anhang gepackt.
Skript zur obersten Fehlermeldung:

_code = format["_trg1 setTriggerStatements [this && alive %1 , 'handle = [(thislist select 0)] spawn {_target = _this select 0; while{true} do{tatgrp move position _target; sleep 1;}};', ''];", vehicleVarName _unit];

mittlere Fehlermeldung:

_code = format["_trg1 setTriggerStatements ['this && alive %1' , 'handle = [(thislist select 0)] spawn {_target = _this select 0; while{true} do{tatgrp move position _target; sleep 1;}};', ''];", vehicleVarName _unit];

untere Fehlermeldung:

_code = format["%1 setTriggerStatements [this && alive %2, 'handle = [(thislist select 0)] spawn {_target = _this select 0; while{true} do{tatgrp move position _target; sleep 1;}};', ''];",_trg1,vehicleVarName _unit];

Fällt dir was auf/ein Vienna?

Vienna
15.02.2013, 22:54
Anstelle von _trg1 darfst du im Text nur %1 anführen. Als Code nach der Abfrage gibt vorerst nur eine Textausgabe ein, um den Fehler einzugrenzen.

TheRhisd
15.02.2013, 23:00
Hab den unteren Code mal geändert:

_code = format["%1 setTriggerStatements [this && alive %2,hint 'klappt', ''];",_trg1,vehicleVarName _unit];

immer noch der gleiche Fehler wie vorher (unterer auf dem Bild) :(

Vienna
15.02.2013, 23:12
Funktioniert es, wenn du den Code direkt eingibst:

_trg1 setTriggerStatements [this && alive _unit, hint 'klappt', ''];

Korrekte Lösung ab Post #14!

TheRhisd
15.02.2013, 23:22
Wenn ich den Code so direkt eingebe, wird der Trigger ausgelöst, ohne dass die Aktivierungsbedingungen ( West, Present ) ausgelöst wurden...
Ein normal auf der Karte erstellter Trigger mit gleichen Einstellungen löst erst aus wenn ich hineingehe also liegt es sehr wahrscheinlich an dem Code.

Vienna
15.02.2013, 23:33
Ich sehe gerade, dass die Bedingung und die Aktionen alle als String einzugeben sind. Also muss die Codezeile bei der direkten Eingabe so aussehen:

_trg1 setTriggerStatements [format["this && alive %1",vehicleVarName _unit], "hint 'klappt'", ""];

TheRhisd
15.02.2013, 23:41
Super klappt jetzt danke :)
Noch ne kleine Frage nebenbei:
Kann/Sollte man Trigger im Verlauf der Mission löschen (aus Performancegründen) oder fressen die kaum Leistung wenn sie nicht mehr Benutzbar sind, weil Einheiten tot sind etc. ?
Falls ja gibts nen extra Befehl dafür oder auch mit deleteVehicle? Hab da (http://community.bistudio.com/wiki/Category:Scripting_Commands) nämlich nichts in die Richtung gesehen...

Nachtrag:
Jetzt klappt zwar die Abfrage des Triggers richtig aber der Code-Block bei Aktivierung wird gar nicht oder falsch ausgeführt:

_trg1 setTriggerStatements [format["this && alive %1",vehicleVarName _unit], "'handle = [thislist select 0] spawn {_target = _this select 0; while{true} do{tatgrp move position _target; sleep 1;}};'", ""];

Vienna
16.02.2013, 00:03
Vermutlich sind die einfachen Anführungszeichen bei der Aktion zuviel. Wir so gehen: "...code...". Die einfachen Anführungszeichen sind nur erforderlich, wenn der Code Text enthält.

Jetzt ist es nicht mehr notwendig die gesamte Codezeile als Text zu erstellen.

Es ist sicher besser nicht mehr benötigte Trigger zu löschen.

Geht mit z.B. deleteVehicle _trg1

TheRhisd
16.02.2013, 00:26
Vielen Dank für deine Hilfe :) klappt jetzt eig. alles so wie es soll.
Ich wünsche noch eine schöne Nacht ;)

Vienna
16.02.2013, 00:42
Jetzt ist die Funktionsweise klar. In alle Parameter wird Code als String eingegeben, das call compile macht der Befehl setTriggerStatements automatisch.

Nun können wir ruhig schlafen.