Scripts machen mich wahnsinnig

5 Beiträge / 0 neu
Letzter Beitrag
Bild des Benutzers Lenny
Offline
Last seen: vor 1 Monat 1 Woche
Gastspieler
Beigetreten: 06/04/2018 - 07:29
Scripts machen mich wahnsinnig

Hi,

ich verlier noch den Verstand mit diesem blöden SQF. Vielleicht kann mir einer hier erklären, was ich falsch mache.

Ich möchte per Script eine Bombe entschärfen lassen. Dazu hab ich ein hübsches elektronisches Gerät in dessen Init ich folgendes aufrufe:

private _handle = execVM "scripts\disarm.sqf";

In dem disarm.sqf steht dann folgendes:

red = true;
green = true;
blue = true;
bombTrigger addAction ["<t color='#ff0000'>Roten Draht durchtrennen</t>","scripts\redWire.sqf",nil,1.5,true,true,"","red",5,false,"",""];
bombTrigger addAction ["<t color='#00ff00'>Gruenen Draht durchtrennen</t>","scripts\greenWire.sqf",nil,1.5,true,true,"","green",5,false,"",""];
bombTrigger addAction ["<t color='#0000ff'>Blauen Draht durchtrennen</t>","scripts\blueWire.sqf",nil,1.5,true,true,"","blue",5,false,"",""];
bombTrigger addAction ["Richtigen Draht durchtrennen","scripts\rightWire.sqf",nil,1.5,true,true,"",str(player getUnitTrait "explosiveSpecialist"),5,false,"",""];
 

 

Das ist zwar alles nicht schön, aber es funktioniert halbwegs. Was aber nicht klappt, ist, daß der "explosiveSpecialist" die zusätzliche AddAction Option bekommt. Also es klappt schon, aber nur in Singleplayer und nur wenn ich von Anfang an EOD war. 

Mir ist auch klar, warum es nicht klappt. Ich muss die Traits des Callers abfragen, nicht des Players. Aber den Caller kann ich nur abfragen, wenn ich execVM mit "_args" übergebe und dann sowas mache wie "_caller = _this select 1;"

Aber das geht nicht. Sobald ich _args vor execVM setze, verschwindet das komplette AddAction Menü.

Hat einer von euch eine Ahnung, was da schief läuft? Hab ich was falsch verstanden? Gibts eine neue Syntax, die nicht im BI Wiki beschrieben ist? 

Außerdem verstehe ich nicht, warum ich die drei Variablen red, green und blue nicht private machen kann. Wenn ich daraus _red, _green, _blue mache, verschwindet das AddAction Menü ebenfalls.

Danke schon im Voraus.

Lenny

Wo laufen sie denn?! Wo laufen sie denn?!

Bild des Benutzers Der alte Benni
Offline
Last seen: vor 36 Minuten 1 Sekunde
GastspielerVeteran: Kampagne THEMIS II Q2 2015Veteran: Kampagne Kalter Entzug Q4 2015Veteran: Kampagne Phönix Q2 2016Veteran: Kampagne Solomon Q4 2017
Beigetreten: 30/08/2015 - 23:05

Moinsen.
Zu beginn würde ich erstmal davon abraten, dass ganze script in der Init von dem Objekt zu starten, da das oft zu Problem führen kann und sehr schnell sehr unübersichtlich wird. Daher würde ich die addActions in der initPlayerLocal hinzufügen, oder dort das Script aufrufen.

Mir ist leider unklar wie das System funktionieren soll. Bis jetzt sieht es für mich so aus, dass ein explosives Specialist direkt weiß welches der 3 Kabel er zerschneiden muss und das ein Normalo halt sein Glück versuchen kann und eins der drei das richtige ist.
 

Es sei angemerkt, dass ich mich schon lang nicht mehr mit normalen addActions auseinander gesetzt habe (sondern nur mit ACE addActions) und damit alle meine Aussagen falsch sein könnten.


Die Variabeln red,green,blue können nicht lokal sein, da die Condition quasi ein einzellnes script ist und diesem Script wären die lokalen Variabeln dann nicht bekannt und könnten auch nicht von außen geändert werden. 

Die Variabeln sind hier aber immer noch lokal bei dem Spieler. Heißt, dass die addAction bei den anderen Spielern nicht weggeht wenn der ein Spieler sie aktiviert. Wenn es das Ziel ist die addActions  quasi über alle spieler zu synchronisieren so musst du hier mit globalen, bzw.  mit public Variabeln arbeiten. 
Entweder arbeitest du dort mit getVariable und setVariable oder auch mit publicVariable. 
Sollten die addActions aber nur beim Spieler entfernt werden, so kannst du einfach die Flag bei "HideOnUse" setzen.

Desweitern würde ich dir von execVM abraten, da es relativ langsam ist und es manchmal Probleme gibt wenn man ein script mehrmals aufruft. Eine optimale Lösung wären dort Funktionen.
Das mit caller sollte eigentlich egal sein, da das Script immer noch lokal läuft uns somit der caller = player ist. Aber in den addAction script sind die argumente (targer,caller,id) eigentlich immer vorhanden. Das heißt du player einfach mit (_this select 1) ersetzen kannst.
Noch etwas was Probleme machen könnte ist der str Befehl. Er sollte eigentlich funktionieren, aber das Arma Arma ist und es schöner zu lesen ist würde ich eher :

"(this select 1) getUnitTrait 'explosiveSpecialist'"

schreiben.

 

Sollte es fragen geben, einfach im Discord/TS anhauen, da kann ichs dir auch mündlich bzw. besser erklären.

Mit freundlichen Grüßen,

Der alte Benni

Bild des Benutzers Lenny
Offline
Last seen: vor 1 Monat 1 Woche
Gastspieler
Beigetreten: 06/04/2018 - 07:29

Danke für die Antwort. Das Problem ist aber eben, daß ich gerade (_this select 1) nicht aufrufen kann. Da bekomm ich dann einen Fehler, wo er scheinbar nicht weiß, was er mit "_this" machen soll. Vielleicth liegts an dem ExecVM ... ich werd mal sehen, ob ich ohne das auskomme.

Wo laufen sie denn?! Wo laufen sie denn?!

Bild des Benutzers EinStein
Offline
Last seen: vor 5 Stunden 16 Minuten
Medien: SilberMitspielerTrupp: Schwarz
Beigetreten: 17/03/2018 - 15:09

Mahlzeit,

zunächst stimmt es, dass man so wenig wie möglich in die inits der Objekte schreiben sollte. Da sollten maximal Objekt spezifische Variablen deklariert werden.

AddActions sollten dabei, wenn möglich, alle in der initPlayerLocal.sqf hinterlegt werden um keine lokalitäten Probleme zu bekommen.


Da wir mit ACE spielen habe ich bei der addAction vom richtigen Draht die [player Variable "ACE_isEOD"] abgefragt. (Returnvalue: Boolean).
Also sollte der EOD durchs Loadout (oder in der init) durch player setVariable ["ACE_isEOD", true]; zum EOD gemacht werden.

bomb_01 addAction [
	"(ACE_EOD) richtigen Draht durchtrennen", 
	{
		hint "richtigen Draht durchtrennt";
	}, 
	[], 5, false, true, "", "_this getVariable 'ACE_isEOD'", 2];

Wenn jeder andere auch Drähte durchtrennen soll, sähe das dann für jeden Draht ähnlich aus.

bomb_01 addAction [
	"roten Draht durchtrennen", 
	{
		hint "roten Draht durchtrennt";
	}, 
	[], 10, false, true, "", "", 2];

Den "hint" tauschtst du dann durch den Code aus, der passieren soll. Wenn das nur 2 Zeilen sind, schreib sie ruhig da rein, ansonsten lager sie aus und sprich das Skript mit [] spawn compile preprocessFileLineNumbers "scripts\was_auch_immer.sqf"; an.

In den [] kannst du Argumente übergeben, wie [_target, _caller] (also hier würden übergeben [bomb_01, playerID_der_drückt]).

Annehmen im Script tust du das mit :

params ["_bombe", "_spieler"];

Dann verwendest du im Script nur noch _bombe und _spieler (neue Namen (lokal im Script)).


Solltest du noch Hilfe brauchen schreib mich an oder sprich mich an. 
Zweites würde ich bevorzugen, dann kommen wir schneller zum Ziel.

Mit Besten Grüßen
EinStein

Bild des Benutzers Lenny
Offline
Last seen: vor 1 Monat 1 Woche
Gastspieler
Beigetreten: 06/04/2018 - 07:29

Hey EinStein,  vielen Dank, ich werd das gleich mal testen.

Da Scripts in Ama für mich weiterhin ein wenig Black Magic sind, komm ich bei Gelegenheit gern auf dein Angebot zurück!

Wo laufen sie denn?! Wo laufen sie denn?!