ACE-Interaktion

  • Hier auch noch mal die Frage, die ich bei Facebook bei Armaworld gestellt hab:


    Skripting-Frage: Ich möchte eine eigene ACE-Interaktion für ein Objekt machen. Dazu habe ich in einer .sqf die entsprechenden Befehle gesetzt. Das funktioniert auch. Nur wenn ich die .sqf dann über BIS_fnc_MP und BIS_fnc_execVM auf dem Server starte (die .sqf wird in der init.sqf angesprochen), dann erscheint die Aktion doppelt, wenn ich sie auf dem Server teste. Und das Skript selbst funktioniert gar nicht. Worauf muss ich achten? Hat jemand einen Rat?


    Anbei der Code in der init.sqf und der Code in dem angesprochenen Skript:

    (wie man dann wohl an dem Code sieht, bin ich nicht gut im scripten, vieles ist in mühsamer Kleinarbeit zusammengeklaut; lokal funktioniert das Skript aber, jetzt muss es nur wieder mp-tauglich gemacht werden)

    Code: init.sqf
    1. my_fnc_do1 = compile preprocessFile "ausgabe.sqf";
    2. my_fnc_do2 = compile preprocessFile "ausgabe_2.sqf";
    3. [[player, "ausgabe.sqf"], "BIS_fnc_execVM", nil, true] call BIS_fnc_MP;
    4. [[player, "ausgabe_2.sqf"], "BIS_fnc_execVM", nil, true] call BIS_fnc_MP;

    Os Iusti Meditabitur Sapientiam
    (Der Mund des Gerechten soll Weisheit sprechen)


    Et Lingua Eius Loquetur Indicium.
    (und seine Zunge das Urteil.)


    Beatus Vir Qui Suffert Tentationem.
    (Gesegnet sei der Mann, der der Versuchung widersteht.)

    Einmal editiert, zuletzt von Christovur ()

  • Hab ich auch schon überlegt, ich hab aber gelesen, dass der Effekt gleich ist.

    Os Iusti Meditabitur Sapientiam
    (Der Mund des Gerechten soll Weisheit sprechen)


    Et Lingua Eius Loquetur Indicium.
    (und seine Zunge das Urteil.)


    Beatus Vir Qui Suffert Tentationem.
    (Gesegnet sei der Mann, der der Versuchung widersteht.)

  • Okay, dass das Skript ausgeführt wird, habe ich durch "if ((isMultiplayer) || (!isdedicated)) then {...};" hinbekommen. Allerdings funktioniert der Code jetzt nicht mehr.


    Ich glaube, es liegt daran, dass "player" nicht definiert ist. Ich habe "player" als Parameter über BIS_fnc_MP weitergegeben und _player = _this select 0 im Skript selbst verwendet. Gibts hier bessere Vorgehensweisen?

    Os Iusti Meditabitur Sapientiam
    (Der Mund des Gerechten soll Weisheit sprechen)


    Et Lingua Eius Loquetur Indicium.
    (und seine Zunge das Urteil.)


    Beatus Vir Qui Suffert Tentationem.
    (Gesegnet sei der Mann, der der Versuchung widersteht.)

  • Verstehe das Problem nicht so ganz. Wenn Du den Code in der init.sqf ausführst, warum dann überhaupt der BIS_fnc_MP Befehl?


    Macht doch nur dann Sinn, wenn z.B. der Server möchte, dass bei player_christovur ein Befehl/script ausgeführt wird oder andersrum.


    EDIT: Dann macht auch der player keinen Sinn. Wenn der Server das Script bei player ausführen lassen will, kann beim Server natürlich nicht player als Variable stehen.

  • Das heißt, ich muss das Skript bei jedem Spieler initialisieren?

    Os Iusti Meditabitur Sapientiam
    (Der Mund des Gerechten soll Weisheit sprechen)


    Et Lingua Eius Loquetur Indicium.
    (und seine Zunge das Urteil.)


    Beatus Vir Qui Suffert Tentationem.
    (Gesegnet sei der Mann, der der Versuchung widersteht.)

  • Ich probiere das später mal aus. Ich weiß immer nicht, was wo ausgeführt werden muss. :D Aber letztlich sollen die Spieler die ACE-Interaktion nutzen. Also hat der Server wohl nichts damit zu tun.

    Os Iusti Meditabitur Sapientiam
    (Der Mund des Gerechten soll Weisheit sprechen)


    Et Lingua Eius Loquetur Indicium.
    (und seine Zunge das Urteil.)


    Beatus Vir Qui Suffert Tentationem.
    (Gesegnet sei der Mann, der der Versuchung widersteht.)

  • Die init.sqf wird auf dem Server als auch auf allen Clients ausgeführt.


    Wenn Du also möchtest, dass die ACE Interaktion für jeden Spieler, aber nicht auf dem Server ausgeführt wird kannst Du mit

    Code
    1. if (hasInterface) then { hier den Code rein}

    in der init.sqf dafür sorgen, dass der Code nur bei Spielern (sowohl Single- als auch Multiplayer) ausgeführt wird.


    Hier noch was zu hasInterface, isServer, isDedicated. Bisschen runterscrollen bis zum Beitrag von Killzone Kid.

  • Es hat endlich geklappt! Danke Commander für deine Hilfe.


    Ich habe jetzt in der init.sqf folgendes stehen:


    Code: init.sqf
    1. my_fnc_do1 = compile preprocessFile "ausgabe.sqf";
    2. my_fnc_do2 = compile preprocessFile "ausgabe_2.sqf";
    3. remoteExec ["my_fnc_do1", -2, true];
    4. remoteExec ["my_fnc_do2", -2, true];


    Ich habe also keinen Parameter mehr ans Skript weitergegeben, weil das Skript eh lokal ausgeführt wird.


    Im Skript selbst hab ich dann

    waitUntil {!isNull player};


    und im ACE-Code habe ich nochmal

    if (hasInterface) then {};


    Jetzt funktioniert es zumindest, wenn ich alleine auf dem Server das teste. Jetzt müsste nur noch getestet werden, ob JIP passt und ob andere Leute das auch können. Dann bin ich zufrieden. :3

    Os Iusti Meditabitur Sapientiam
    (Der Mund des Gerechten soll Weisheit sprechen)


    Et Lingua Eius Loquetur Indicium.
    (und seine Zunge das Urteil.)


    Beatus Vir Qui Suffert Tentationem.
    (Gesegnet sei der Mann, der der Versuchung widersteht.)

  • Ähm....

    wenn Du remoteExec so einsetzt, werden die Scripte jedesmal bei allen Spielern ausgeführt, wenn einer die Mission joint. Wenn also am Anfang 30 Spieler joinen wird das Script bei jedem 30mal ausgeführt.


    ich würde es in die init.sqf schreiben. So wird es nur einmal bei jedem Spieler ausgeführt.

    Code
    1. if (hasInterface) then {
    2. _loiter = [] execVM "ausgabe.sqf";
    3. waitUntil {scriptDone _loiter};
    4. _loiter = [] execVM "ausgabe_2.sqf";
    5. waitUntil {scriptDone _loiter};
    6. };
  • Wo steht denn dass das eine richtig und das andere falsch ist?


    Ich nutze öfter mal if (isServer) then.... if (hasInterface). Das hat dann durchaus mehrere Gründe. Einer davon ist sicherlich "zu faul ne neue Datei zu erstellen", ein anderer Grund ist, das es vorkommt, dass Code in bestimmter Reihenfolge ausgeführt werden soll und es ist einfacher diesen Code dann in eine einzige Datei zu schreiben als über mehrere Dateien.


    Lol, mir ist gerade aufgefallen das es auch eine initServer.sqf gibt. Habe ich noch nie genutzt... und änder das jetzt :D Ja, so lernt man immer was dazu.

    https://community.bistudio.com/wiki/Initialization_Order