ACRE²-Fahrzeugracks edieren ohne zu modden

  • Moin,

    in einer Mission an der ich gerade herumbastele habe ich das Problem, dass mir mit dem ACRE²-Standardverhalten in die verbauten AAV jeweils ein Rack mit dem classname "ACRE_VRC103" initialisiert wird, diese können aber nur "ACRE_PRC117F" aufnehmen, was weder in die dargestellte Zeit passt, noch ausreichend ist. Ziel ist, in jedem AAV zwei durch die Crew bedienbare "ACRE_PRC77" zu Verfügung zu stellen.


    Eine Person, die auch versteht, was sie schreibt hat mir dies zusammengestöpselt:




    [CLASSNAME, {}] call acre_api_fnc_initVehicleRacks;

    private _racks = [CLASSNAME] call acre_api_fnc_getVehicleRacks;
    [
    CLASSNAME, (_racks select 0)] call acre_api_fnc_removeRackFromVehicle;

    [CLASSNAME, ["ACRE_VRC64", "Upper Dash", "ComA", false, ["inside","crew"], [], "ACRE_PRC77", [], []], false] call acre_api_fnc_addRackToVehicle;
    [
    CLASSNAME, ["ACRE_VRC64", "Lower Dash", "ComB", false, ["inside","crew"], [], "ACRE_PRC77", [], ["intercom_1"]], false] call acre_api_fnc_addRackToVehicle;


    Im Editor, Singleplayer funktioniert das auch, auf dem Server zeigt sich wieder das Standardverhalten von ACRE².

    Als Tipp habe ich erhalten, dass sich die Racks wohl in der Postinit, initialisieren.


    1. Ist irgendein wichtiger Fehler in obigen Script?
    2. Wie, wo, wann sollte es laufen, damit die Racks und Funkgeräte wie gewünscht initialisiert werden?

    Dank im Voraus!

  • Du musst die Funktion erstens auf dem Server callen, zweitens musst du die Initialisierung forcieren.

    EDIT

    Also z. Bsp. in der InitServer-sqf:


    Code
    1. [meincoolesfahrzeug, ["ACRE_VRC64", "Upper Dash", "ComA", false, ["Crew"], [], "ACRE_PRC77", [], ["intercom_1"]], true, {}] call acre_api_fnc_addRackToVehicle;
    2. [meincoolesfahrzeug, ["ACRE_VRC64", "Lower Dash", "ComB", false, ["Crew"], [], "ACRE_PRC77", [], ["intercom_1"]], true, {}] call acre_api_fnc_addRackToVehicle;
  • Das sieht mir ziemlich falsch aus, Zumi. this impliziert, dass es in einer Init-box läuft, also bereits global. Warum dann remoteExec mit Target? Bevor hier Fehlerbehebung stattfindet, sollte man erst einmal diagnostizieren, was überhaupt falsch läuft. Sonst ist es alles ein Ratespiel und hilft auch dem nächsten nicht.

  • Ja richtig, das this impliziert das fälschlicherweise. Ersetze this mit dem Variablennamen und führe das irgendwo aus. Kannst in der initServer ohne remoteExecCall ausführen zum Beispiel. Was ich vermute ist eben erstens, dass die Funktion nicht serverseitig ausgeführt wird und zweitens, dass, weil er den Parameter nach der intercom mit "false" rübergibt statt mit true, das Rack nicht initialisiert wird.

  • Moin,

    ich bin der Zweite im Bunde.

    Die Funktion wird natürlich auf dem Server ausgeführt, aber Zumi hat trotzdem den richtigen Tipp mit der force Init gegeben. Stelle ich diese auf true, erhält das Fahrzeug sein Rack.

    Jetzt gibt es nur noch ein kleines Problem, dass die alte 117-Funke des Fahrzeuges nicht entfernt wird. Heißt wenn ich aufsitze hat das Fahrzeug 3 Racks (2x 77er, 1x 117er).

    Ich hatte jetzt noch ein wenig herumprobiert und es scheint als ob ACRE beim ersten Aufsitzen das Rack des Fahrzeuges initialisiert. Führe ich nämlich das Script nach dem ersten Aufsitzen aus, wird die 117 Funke entfernt und ich habe 2x 77er an Bord.

    Meine aktuelle Lösung des Problems ist: Ich lasse die Crew einfach im Fahrzeug bei Missionsstart spawnen und führe das Script mit kurzer Verzögerung aus. Wenn jemand einen eleganteren Weg hat, dann gerne her damit!


    Vielen Dank Zumi und commy für die Hilfe!

  • Ich würde mit dem CBA-Event von acre_sys_racks hier arbeiten:

    Also einfach bevor du die Funken per Script addest:

    Code
    1. {
    2. ["acre_sys_rack_removeVehicleRacks", [deincoolerfahrzeugname, _x], deincoolerfahrzeugname] call cba_fnc_targetEvent;
    3. } foreach ([deincoolerfahrzeugname] call acre_sys_rack_fnc_getVehicleRacks);
  • Ich hatte jetzt noch ein wenig herumprobiert und es scheint als ob ACRE beim ersten Aufsitzen das Rack des Fahrzeuges initialisiert. Führe ich nämlich das Script nach dem ersten Aufsitzen aus, wird die 117 Funke entfernt und ich habe 2x 77er an Bord.

    Meine aktuelle Lösung des Problems ist: Ich lasse die Crew einfach im Fahrzeug bei Missionsstart spawnen und führe das Script mit kurzer Verzögerung aus. Wenn jemand einen eleganteren Weg hat, dann gerne her damit!

    Soweit ich das beurteilen kann, fügt Acre die Racks nach 0.5 Sekunden ungefähr dem Fahrzeug hinzu. Initialisiert werden sie, wie du richtig sagtest, nachdem mit cba_fnc_waitUntilandExecute der erste Spieler im Fahrzeug gefunden wurde bzw. er defaultet es auf den ersten Spieler aufm Server überhaupt.

  • Dieser Block hier in der API Funktion erklärt es:

    Und mit dem CBA Event wird dann eben das hier gemacht:

    Code
    1. [QGVAR(addVehicleRacks), {
    2. params ["_vehicle", "_rackClassname", "_displayName", "_rackName", "_rackShortName", "_isRadioRemovable", "_allowed", "_disabled", "_mountedRadio", "_components", "_intercoms"];
    3. [_vehicle, _rackClassname, _displayName, _rackName, _rackShortName, _isRadioRemovable, _allowed, _disabled, _mountedRadio, _components, _intercoms] call FUNC(addRack);
    4. // Give some time for the racks to initialise properly
    5. [{
    6. [_this select 0] call FUNC(configureRackIntercom);
    7. }, [_vehicle], 0.5] call CBA_fnc_waitAndExecute;
    8. }] call CBA_fnc_addEventHandler;
  • Ich danke allen [außer Schmitt ;-)].

    Mein Co-Missionsbauer (Pyro) ist ja schon eingestiegen und und von mir wird nix Wichtiges mehr kommen, denn ich verstehe schon wieder nur Bahnhof...

    Wie wird das oben genannte Skript denn überhaupt ausgeführt?


    Und was ist "CLASSNAME"? Laut Dokumentation schlucken die genannten Funktionen gar keine Klassen, sondern Objekte.

    "CLASSNAME" ist in dem Beispiel der Variablenname des Fahrzeugs, ich habe vergessen es zu erwähnen, warum der anonyme Ersteller des Scripts "CLASSNAME" verwendet hat, bleibt sein Geheimnis.

  • Um hier nochmal Feedback zu geben, nicht das jemand ins Messer rennt und glaubt das klappt verlässlich.


    Es gab auf dem Server doch Probleme mit den Racks und der Acre init.

    a) Wenn das Fahrzeug initialisiert wurde und ich danach das Script drüber laufen lasse, hatte ich gar keine Funken mehr. Der Fehler tritt nur auf, wenn man zu zweit auf dem Server ist, alleine klappt es auf wundersamer Weise.

    b) Wenn ich auf das entfernen der Funke pfeife und in meinem Fall damit lebe, dass ich eine 117er von Haus aus und 2x 77er über das Skript bekomme, dann spammt ACRE die Server rpt hiermit voll:

    Code
    1. 17:54:59 [ACRE] (sys_data) WARNING: Non-existent radio 'acre_vrc103_id_3' called getState system event!


    Letzten Endes habe ich mich zum Schutz der Mission dazu entschieden, dass die Racks so bleiben wie sie sind und ich Rucksackfunken vergeben habe.


    Wenn hier jemand zufällig drüber stolpert, die Skripts sind mit Vorsicht zu nutzen.

  • Und was hattest du nun benutzt? Statt gleich die Segel zu streichen könnte man noch mal darüber nachdenken. Ich hatte ja ursprünglich gefragt, wie das originale Skript überhaupt ausgeführt wurde. Aber anstatt ordentlich Fehleranalyse zu betreiben, hast du dich von Zumi's Lösung (?) ablenken lassen.

  • Ich habe das ursprüngliche Skript genutzt nur mit der Änderung von Zumi, dass die Initialisierung forciert wird.

    Meine genannten Fehler sind mir kurz vor Eventstart aufgefallen, weshalb ich das Thema abgeblasen habe.


    Gerade habe ich also keine wirkliche Verwendung mehr für das Skript, aber wir können gerne für die Nachwelt noch einmal auf die Jagd nach dem Fehler gehen.


    Das Skript wird wird über die InitServer kurz nach Missionsstart über folgende Zeile abgefeuert:

    Code
    1. {_x execVM "scripts\aav.sqf"} forEach [aav_mo, aav_res_mo, aav_pio, aav_res_pio]; // AAV


    in der sqf wird das Fahrzeug neben den Racks noch mit Munition etc beladen. Das klappt auch alles einwandfrei.

    Hier der Inhalt mit dem relevantem Zeug:



    Damit hier kein falsches Bild von mir entsteht, ich habe selbst keine wirkliche Ahnung vom Skripten und habe auch nicht den präsentierten Versuch geschrieben. Was ich kann sind Sachen testen und schauen ob es klappt ;)

  • Hatte nen Typo drin beim CBA-event in der Eile...
    Das hier teste ich jetzt selber.


    Code
    1. {
    2.     ["acre_sys_rack_removeVehicleRacks", [deincoolerfahrzeugname, _x], deincoolerfahrzeugname] call cba_fnc_targetEvent;
    3. } foreach ([deincoolerfahrzeugname] call acre_sys_rack_fnc_getVehicleRacks);
  • //Racks
    [_fhz, {}] call acre_api_fnc_initVehicleRacks;

    Das hier ist obsolet, weil du das hier bereits tust:


    [_fhz, ["ACRE_VRC64", "Upper Dash", "ComA", false, ["Crew"], [], "ACRE_PRC77", [], ["intercom_1"]], true, {}] call acre_api_fnc_addRackToVehicle;


    private _racks = [_fhz] call acre_api_fnc_getVehicleRacks;
    [_fhz, (_racks select 0)] call acre_api_fnc_removeRackFromVehicle;

    Das wird nicht funktionieren. Versuche es mal mit dem CBA-Event.