Benutzername:

Passwort:

Autor Thema: Missionsbau: Item basierend auf Variablenwert versetzen  (Gelesen 7482 mal)

niCe Diesel

  • Platin Member
  • ******
  • Beiträge: 3218
  • Vorstand/ArmA2-BeLtr a.D.
    • Profil anzeigen
Missionsbau: Item basierend auf Variablenwert versetzen
« am: 22. Januar 2014, 19:03:13 »
Beim Setzen von Objekten auf dem Nimitz-Flugzeugträger muss man "setPosASL" benutzen, um sie auf dem Träger auf den verschiedenen Decks zu positionieren. Dummerweise unterscheidet sich diese Höhe, je nachdem wo ich den Träger positioniere und ob die Mission auf einem dedicated server oder nicht-dedicated gestartet wird.
Meine Idee:
init.sqf:
nimitz_carrier_altitude_offset = 0;
if (isDedicated) {
nimitz_carrier_altitude_offset = 0.2;
};

mission.sqm:
vehicle="JDG_carrier_Spawner";
init="this setPosASL [getPos this select 0, getPos this select 1, (getPos this select 2) + nimitz_carrier_altitude_offset];";

Problem: Funktioniert nicht. Anscheinend kann man den Carrier nicht 20 cm in die Luft setzen. Alle Objekte entsprechend zu versetzen, z.B. mit:
init="this setPosASL [getPos this select 0, getPos this select 1, 7.3 + nimitz_carrier_altitude_offset];";
scheint auch nicht zu gehen. Dann steht das Objekt irgendwie auf Wasserhöhe.

Ideen? Syntax falsch? Andere Vorschläge?

OFFX

  • Senior Member
  • **
  • Beiträge: 57
    • Profil anzeigen
Re: Missionsbau: Item basierend auf Variablenwert versetzen
« Antwort #1 am: 23. Januar 2014, 10:58:29 »
in die ini Zeile der einheit, wenn du so was meinst, da kann die Nimitz auch auf einem Berg stehen, glaube ich :-).
this setPos [(getPos this select 0),(getPos this select 1),(getPos Nimitz select 2)+7.2]

niCe Diesel

  • Platin Member
  • ******
  • Beiträge: 3218
  • Vorstand/ArmA2-BeLtr a.D.
    • Profil anzeigen
Re: Missionsbau: Item basierend auf Variablenwert versetzen
« Antwort #2 am: 23. Januar 2014, 12:52:10 »
Gute Idee, das muss ich mal probieren. In der README der Nimitz wird setPosASL empfohlen, aber kann sein, dass sich Nimitz-Wasserlinie und "sea level" trotzdem genau um diesen Teil unterscheiden.
Ich frage mich dann aber noch, wie ich die "7.2" korrekt als Variable extrahiere. Müsste doch gehen, wenn ich einfach in der init.sqf die variable mit wert schreibe und dann darauf zugreife.

niCe psYGer

  • Gold Member
  • *****
  • Beiträge: 1580
    • Profil anzeigen
Re: Missionsbau: Item basierend auf Variablenwert versetzen
« Antwort #3 am: 24. Januar 2014, 12:23:13 »
nimitz_carrier_altitude_offset = 0;
if (isDedicated) {
nimitz_carrier_altitude_offset = 0.2;
};

Besser wäre:
if (isDedicated) then {
nimitz_carrier_altitude_offset = 0.2;
} else {
nimitz_carrier_altitude_offset = 0;
};


Oder in kurz:
nimitz_carrier_altitude_offset = if (isDedicated) then {0.2} else {0};
Der Sinn hinter dem Code ist mir aber nicht klar.

Kann man denn überhaupt in der mission.sqm auf eine Variabel, die in der init.sqf initialisiert wird zugreifen?
Die mission.sqm wird vermutlich vor der init.sqf ausgeführt, wie es mit den init-Zeilen in der misison.sqm aus sieht weiß ich nicht.
Eine nachträgliche Modifikation des "JDG_carrier_Spawner" wird aber vermutlich so oder so keinen Sinn haben, da es sich ja hier nicht um die Trägerteile selbst handelt.
« Letzte Änderung: 24. Januar 2014, 13:04:29 von niCe psYGer »

niCe psYGer

  • Gold Member
  • *****
  • Beiträge: 1580
    • Profil anzeigen
Re: Missionsbau: Item basierend auf Variablenwert versetzen
« Antwort #4 am: 24. Januar 2014, 12:32:35 »
setPos -> bezieht sich auf die höchste Ebene, egal welche das ist.
setPosASL -> bezieht sich auf den Meeresspiegel
setPosATL -> bezieht sich auf festen Boden/Grund

Unterschiede sind auf Bergen oder auf dem Meer leicht zu erkennen:
setPos [x,y,0] ist an Land am Boden oder auf dem Meer an der Wasseroberfläche.
setPosASL [x,y,0] ist tief im Boden oder an der Wasseroberfläche. (an Land wird idR der Kollision nach oben ausgewichen)
setPosATL [x,y,0]  ist am Boden oder am Meeresgrund.
« Letzte Änderung: 24. Januar 2014, 12:55:36 von niCe psYGer »

niCe psYGer

  • Gold Member
  • *****
  • Beiträge: 1580
    • Profil anzeigen
Re: Missionsbau: Item basierend auf Variablenwert versetzen
« Antwort #5 am: 24. Januar 2014, 12:46:13 »
this setPos [(getPos this select 0),(getPos this select 1),(getPos Nimitz select 2)+7.2]

Sollte das selbe erreichen:
this setPos [getPos this select 0,getPos this select 1,7.2]
Liefert denn
systemChat str(getPos this select 2)auf einem Dedi ein anderes Ergebnis als auf einem Host?
« Letzte Änderung: 24. Januar 2014, 12:57:11 von niCe psYGer »

niCe Diesel

  • Platin Member
  • ******
  • Beiträge: 3218
  • Vorstand/ArmA2-BeLtr a.D.
    • Profil anzeigen
Re: Missionsbau: Item basierend auf Variablenwert versetzen
« Antwort #6 am: 24. Januar 2014, 17:10:26 »
while {true} do {
  hintsilent format ["%1", getPosASL player select 2];
  sleep 0.2;
};
Dann player auf flight deck.

Aus Editor:
--> 17.3

Auf dedicated:
--> 17.5

niCe Diesel

  • Platin Member
  • ******
  • Beiträge: 3218
  • Vorstand/ArmA2-BeLtr a.D.
    • Profil anzeigen
Re: Missionsbau: Item basierend auf Variablenwert versetzen
« Antwort #7 am: 25. Januar 2014, 17:29:19 »
Noch ungetestet, aber hier könnte die Lösung stehen:
http://forums.bistudio.com/showthread.php?114667-publicVariables-and-Initialization-Order

Ich probiere mal in der init-Zeile auf die entsprechende Variable aus der init.sqf zu warten und dann das Objekt entsprechend mit setPosASL zu verschieben.

Problem ist auf jeden Fall noch aktuell, weil ich gerade die Carrier Group verschieben will und dadurch stimmen die Höhen wieder alle nicht.

niCe Diesel

  • Platin Member
  • ******
  • Beiträge: 3218
  • Vorstand/ArmA2-BeLtr a.D.
    • Profil anzeigen
Re: Missionsbau: Item basierend auf Variablenwert versetzen
« Antwort #8 am: 26. Januar 2014, 20:38:45 »
Gut, der in oben genanntem Thread genannte Ansatz funktioniert.

Testmission als "proof of concept":
init.sqf:
// Only a single machine (the server) should broadcast the variable
if (isServer) then {
    alt_offset = if (isDedicated) then {5} else {13};
    publicVariable "alt_offset";
};

Objekt in Editor setzen mit Init-Eintrag:
nul = this spawn { waitUntil{not isNil "alt_offset"}; _this setPosASL [getPos _this select 0, getPos _this select 1, 17.5 + alt_offset]};
--> Objekt steht auf 17.5 + 5 m auf dedicated server, auf non-dedi 17.5 + 13 m Höhe.

So in meine Mission mit Nimitz eingebaut, hilft.

Aber: Eigentlich wollte ich damit unterstützen, dass ich die Nimitz einfach an beliebigen Stellen mit allen Kisten etc. hinstellen kann, v.a. auch außerhalb des Kartenrands. Aktuell aber das Problem: Alles wird sichtbar richtig gesetzt aber man kann nicht oder nur sehr schwer auf Kisten zugreifen. Scheint fast so, als ob die Aktivierung der "gear"-Funktion im Aktionsmenü des players ganz woanders positioniert wird als das zugehörige Objekt.
Jemand Ideen?
« Letzte Änderung: 26. Januar 2014, 20:53:15 von niCe Diesel »