PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RPT wird mit "Error Undefined variable in expression" überflutet


[GNC]Lord-MDB
31.07.2013, 15:04
Hi Leute seit dem Update auf 0.74 werden meine Map mit "Error Undefined variable in expression" überflutet.
Vorher habe ich nicht eine einzige dieser Meldungen gehabt nun ca 40-60 Meldungen.

Das ist irgendwas seit dem Update geändert worden bei der Var Vergabe,nur ich weiß nicht was. Es werden Gobale Vars an gemeckert und auch Lokale Vars.

Ich bekomme Meldungen von Spieler die nicht auf dem Server sind und anderen Triggern. Man muss nun sicher Vars einen Startwert wohl geben aber wie geht das bei einem Spieler ???

bz. C1 ist ne spielbare person

if (Alive C1) then {Hint format ["Civi1 %1",name c>
Error position: <C1) then {Hint format ["Civi1 %1",name c>
Error Undefined variable in expression: c1
File mpmissions\__cur_mp.Stratis\client\onrespawn.sqf, line 15

selbe gilt für diese Meldung

Error in expression <if ((isplayer W40) && W40READY) then {READY = READY + >
Error position: <W40) && W40READY) then {READY = READY + >
Error Undefined variable in expression: w40

Xeno
31.07.2013, 15:25
*del*

Xeno

[GNC]Lord-MDB
31.07.2013, 15:31
mmh klar,dann durchforstet ich mal die Map und ergänze das nun an allen ecken :schlagen:

MrCharles
31.07.2013, 15:35
*del*

War ja vorher zu einfach ;)

flickflack
31.07.2013, 15:41
Und für lazy eval braucht man geschweifte Klammern? Ich dachte das Verhalten wäre Usus. Hauptsache alle können wieder ihre Maps ändern ^^

Xeno
31.07.2013, 15:44
*del*

Xeno

[GNC]Lord-MDB
31.07.2013, 16:28
so nun war ich einfach mal so frei und habe das mal in ein anderes Script übernommen mit {} und nun meker das wieder rum :ugly:

W1 eins bin ich :zahn:

Error in expression <if (!isNil W1 && {(isplayer W1) && W1READY}) >
Error position: <isNil W1 && {(isplayer W1) && W1READY}) >
Error isnil: Type Object, expected String,codeauszug

waituntil
{
Sleep 1;
READY = 0;

for "_i" from 1 to 20 do
{
[] call compile format ["if (!isNil W%1 && {(isplayer W%1) && W%1READY}) then {READY = READY + 1;};",_i];
[] call compile format ["if (!isNil E%1 && {(isplayer E%1) && E%1READY}) then {READY = READY + 1;};",_i];
};
[format["%1 / %2",READY,(playersNumber west + playersNumber east)]] execVM "debug.sqf";
((READY == (playersNumber west + playersNumber east)) or (_zeit+80 < time))
};

[GNC]Lord-MDB
31.07.2013, 17:43
und was mir auch nebei auffällt gibt es wohl nun 2 classen von meldungen
Warnmeldungen und Erromeldungen

Denn normalerweise werden ja Scripte bei Fehlermeldungen gestoppt und nicht mehr weiter ausgeführt ,doch die neuen meldungen wiederhole sich alle auch immer

Xeno
01.08.2013, 00:45
*del*

Xeno

[GNC]Lord-MDB
01.08.2013, 11:00
ich habe auch die vermutung das diese "meldung" schon immer gab und die nun nur Aktiv geschaltet wurden.

Ich habe gestern mal ne Map gespielt die völlig fehlerfrei läuft aber dauern pop da ne blackbox auf :ugly:
Und da man das nicht ausblenden kann ,darf ich nun das Rad neu erfinden

Pfandgiraffe
07.08.2013, 08:50
if (!isNil W1 && {(isplayer W1) && W1READY})

Erstmal musst du deine Klammern und Sonderzeichen ordnen, dann klappts auch mit den Fehlermeldungen.

if (!isNil "W1" && {isPlayer W1} && {W1READY}) then {hint "jetz getah!"};

Xeno
07.08.2013, 10:16
*del*

Xeno

Pfandgiraffe
07.08.2013, 10:51
W1 ist kein String sondern in dem Fall das player Obj.

Error in expression <if (!isNil W1 && {(isplayer W1) && W1READY}) >
Error position: <isNil W1 && {(isplayer W1) && W1READY}) >
Error isnil: Type Object, expected String,code

Aber stimmt schon, die Klammern würden grad noch so gehen.

Xeno
07.08.2013, 10:55
*del*

Xeno

[GNC]Lord-MDB
07.08.2013, 14:51
Also den Block von oben musstet ich so umbauen um die Blackbox zu verhindern ,alles andere hat nicht geklappt.

for "_i" from 1 to 20 do
{
[] call compile format ["W%1READY = false;",_i];
[] call compile format ["E%1READY = false;",_i];
};

C1READY = false;
C1READY = false;

waituntil
{
Sleep 1;
READY = 0;

{
if(isPlayer _x) then
{
[] call compile format ["if ((isplayer %1) && %1READY) then {READY = READY + 1;};",_x];
};
}forEach playableUnits;
//Player sidechat format ["R:%1 P:%2 B:%3",READY,(playersNumber west + playersNumber east + playersNumber civilian),(READY == (playersNumber west + playersNumber east + playersNumber civilian)];
[format["%1 / %2",READY,(playersNumber west + playersNumber east + playersNumber civilian)]] execVM "debug.sqf";
((READY == (playersNumber west + playersNumber east + playersNumber civilian)) or (_zeit+80 < time))
};

Xeno
07.08.2013, 15:02
*del*

Xeno

[GNC]Lord-MDB
07.08.2013, 15:16
jo,die frage ist nur,das ist ne Servercontroll scripte,die Gobale Var %1READY wird erster in einen Client Script erstellt,ob das dann da geht mit missionNamespace??

Xeno
07.08.2013, 15:29
*del*

Xeno

[GNC]Lord-MDB
07.08.2013, 15:46
ah schön das ist ja ne interessante info.
Der Befehl missionNamespace ist doch wenn ich das richtig verstehe MP Gobal
also was ich auf den Client mache weiß der Server und andersherum.

Xeno
07.08.2013, 16:03
*del*

Xeno

Pfandgiraffe
07.08.2013, 18:44
Darf ich den Sinn des Scriptes im Allgemeinen anprangern oder steht das nicht zur Debatte? :D

[GNC]Lord-MDB
08.08.2013, 05:15
Darf du und ich werden Dich auch nicht unwissend sterben lassen :naughty:
Damit du erleuchtet wirst :angel:

Pfandgiraffe
08.08.2013, 08:36
Oh, du willst mich erleuchten? Jetzt bin ich gespannt - man kann nie genug strahlen. Raus mit der Sprache. :D

[GNC]Lord-MDB
08.08.2013, 16:25
Das ist ein teil eines Controllscript vom Server der die Clienten kontrolliert ob bei deinen das Intro fertig durch gelaufen ist.
Vielleicht wird nun etwas sinnhafter für dich ;)

Pfandgiraffe
08.08.2013, 16:43
@Lord: Das meinte ich nicht. Was der Code macht ist mir schon klar. Ich finde nur den Sinn dahinter fragwürdig. Und wenn dann prüft der Code eher ob der player auf der Map steht, also die init geladen hat - nicht ob sein Intro durchgelaufen ist. Das setzen der Variable im missionNameSpace macht in deinem Code auch wenig Sinn. Die Variable ist eben immer gesetzt. Was nutzt es da noch diese auf Vorhandensein zu prüfen.


C1READY = false;

waitUntil {
private "_counter";
sleep 1;
_counter = 0;
{
if (!isNil "_x" && {!isNull _x} && {isPlayer _x}) then {
_counter = _counter + 1;
};
} forEach playableUnits;
((_counter == (playersNumber west + playersNumber east + playersNumber civilian)) || {time > 80})

};


Frage an Xeno:
1. Warum wird der Code hier eigentlich nicht in einem While-Loop ausgeführt? Ich hab mal gehört, dass ein waitUntil-Loop "extrem" Performant sein soll. (hat mir ein VBS Mitarbeiter erzählt)

2. Hat es einen Vorteil eine Variable direkt im missionNameSpase zu setzen statt diese direkt an das player Obj zu heften? (was ja letztendlich auch wieder missionNameSpace ist) Also z.B.


{_x setVariable ["affenscheisse",true]} forEach playableUnits;


vs.


{missionNamespace setVariable [format ["W%1_affenscheisse",_forEachIndex], true]} forEach playableUnits;




Grüße

[GNC]Lord-MDB
08.08.2013, 17:18
@Psychobastard

Würde dir zustimmen wenn das so wäre.
Der Block läuft nur ein einizges mal ab beim Mapstart sonst nie mehr.
Durch die Ablaufsteuerung die in der AL Engine 5.0 die in den AL map enthalten ist lauft der Block nur in den Zeit des Intros.
Der Block läuft auch viel weiter hinten,da ist die init schon langst eingearbeitet und hat andere Zweige angesteuert.

1. Warum wird der Code hier eigentlich nicht in einem While-Loop ausgeführt? Ich hab mal gehört, dass ein waitUntil-Loop "extrem" Performant sein soll. (hat mir ein VBS Mitarbeiter erzählt)

Das ist ne waitUntil mit 1 Sek Abfrage,die sollte eigentlich recht schonen sein.

Pfandgiraffe
08.08.2013, 17:25
Nein, das ist eben keine "waitUntil 1Sekunden-Abfrage". Diese Abfrage wiederholt sich solange bis die Condition der letzten Zeile true wird oder die Mission seit 81 Sekunden Serverseitig läuft. ;)

Und wenn ein player Obj plötzlich Null wird (z.B. connection Lost) bevor dieser Code startet, wartet der Server bis dieses Objekt gelöscht wurde oder ddie 80 Sekunden vergangen sind bevor er weiter dieses Script abarbeitet. (was danach auch immer kommt)

Wenn du eine Sekunde auf etwas warten möchtest empfehle ich dir sleep 1; :-P


Grüße

[GNC]Lord-MDB
08.08.2013, 17:48
http://community.bistudio.com/wiki/waitUntil

lies mal was kju geschrieben hat und eigende Erfahrungen bestiegen das in ARMA2

Pfandgiraffe
08.08.2013, 21:18
Ja und? Eben das selbe wie bei einer while-Schleife. Eben eine Verzögerung einsetzen. Das ändert aber nichts an dem vorher geschriebenen.

Rockhount
24.08.2013, 00:22
Achtung!:
[] call compile format ["W%1READY = false;", _i];Die Zuweisung per call compile ist zwar 3-4 Mal langsamer als setVariable:
missionNamespace setVariable [format ["W%1READY", _i], false];aber dafür ist die direkte Zuweisung:
W1READY = false;
3-4 Mal schneller als:
missionNamespace setVariable ["W1READY", false];
Der direkte Aufruf:
_Test1 = W1READY;
ist im Gegensatz hierzu:
_Test1 = missionNamespace getVariable "W1READY";
ca. 25% schneller.
Ich frage mich nur was schneller bzw. sparsamer ist: publicVariable oder setVariable?

Pfandgiraffe
24.08.2013, 04:47
Ich würde immer noch gerne erstmal darüber sprechen ob es in dem Fall überhaupt Sinn macht den missionNameSpace zu bedienen statt direkt das pObj zu nutzen.

[GNC]Lord-MDB
24.08.2013, 10:57
ich sehe da bis jetzt noch keinen Vorteil drin.
Sinn für mich nur zwei verscheidende arten.

Rockhount
24.08.2013, 15:43
TestFunction1 = compile
"
_uid = Test;
_varName = _uid;
_varValue = _varName;
_saveArray = ['ChernaLife', _uid, _varName, _varValue];
_saveArray = 6768768 * 56757657 / 8756858;
";
TestFunction2 =
{
_uid = Test;
_varName = _uid;
_varValue = _varName;
_saveArray = ["ChernaLife", _uid, _varName, _varValue];
_saveArray = 6768768 * 56757657 / 8756858;
};Die Ausführung einer kompilierten Funktion:
call TestFunction1;ist übrigens im Gegensatz zu die einer Normalen:
call TestFunction2;3-4 Mal schneller.