15.02.2013, 20:27 | #1 (permalink) |
Registriert seit: 12.09.2012
Beiträge: 33
|
Lokale Variabel in String?
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, Code:
_unitname = vehicleVarName _unit; und will diesem nun als Bedingung hinzufügen, dass oben ausgelesene Einheit am leben ist: Code:
_trg1 setTriggerStatements ["this && alive /*Hier irgendwie den Inhalt aus _unitname einfügen */", "CODE'", "CODE"]; 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 |
15.02.2013, 21:08 | #2 (permalink) |
Registriert seit: 26.11.2006
Ort: Kiel, S-H
Alter: 58
Beiträge: 3.013
|
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
__________________
Nur ein Beispiel das zeigt wie BI "support" definiert: https://feedback.bistudio.com/T75547 |
15.02.2013, 21:31 | #3 (permalink) |
Registriert seit: 12.09.2012
Beiträge: 33
|
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 Geändert von TheRhisd (15.02.2013 um 21:34 Uhr). |
15.02.2013, 21:36 | #4 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
_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. |
15.02.2013, 21:45 | #5 (permalink) |
Registriert seit: 12.09.2012
Beiträge: 33
|
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. |
15.02.2013, 21:56 | #6 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
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! Geändert von Vienna (16.02.2013 um 00:11 Uhr). |
15.02.2013, 22:11 | #8 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
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! Geändert von Vienna (16.02.2013 um 00:11 Uhr). |
15.02.2013, 22:36 | #9 (permalink) |
Registriert seit: 12.09.2012
Beiträge: 33
|
Klappt leider nicht
Ich habe grade versucht das Script mit der von dir genannten Lösung zu gestalten, was allerdings nicht funktioniert hat.
-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:
_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]; Code:
_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]; Code:
_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]; |
15.02.2013, 23:22 | #13 (permalink) |
Registriert seit: 12.09.2012
Beiträge: 33
|
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. |
15.02.2013, 23:33 | #14 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
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'", ""]; |
15.02.2013, 23:41 | #15 (permalink) |
Registriert seit: 12.09.2012
Beiträge: 33
|
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/C...pting_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: Code:
_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;}};'", ""]; Geändert von TheRhisd (15.02.2013 um 23:54 Uhr). |
16.02.2013, 00:03 | #16 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
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 |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
Themen-Optionen | |
Ansicht | |
|
|
Ähnliche Themen | ||||
Thema | Autor | Forum | Antworten | Letzter Beitrag |
Leerzeichen aus String entfernen | Buliwyf | Editing & Scripting | 5 | 12.07.2011 09:03 |
Multiplayer PROBLEM!!! | Panzagrenadier | Multiplayer | 15 | 18.06.2010 15:12 |