Probleme mit EventHandler

  • Multiplayer

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Probleme mit EventHandler

    Ich versuche jetzt schon seit längerem im hint anzeigen zu lassen,
    wenn ein Zivilist von einem Spieler getötet wird und welcher Spieler das war. Leider erfolglos.


    Mein bisheriger Ansatz schaut wie folgt aus:

    Quellcode: init.sqf

    1. call iV_fnc_unitKilled;


    Quellcode: fn_unitKilled.sqf

    1. addMissionEventHandler ["EntityKilled", {
    2. params ["_killed", "_killer", "_instigator"];
    3. if (isPlayer _killed) exitWith {};
    4. if !(_killed isKindOf "Man") exitWith {};
    5. _killer = _killed getVariable ["ace_medical_lastDamageSource", _killer];
    6. if (isNull _instigator) then {_instigator = _killer}; // player driven vehicle road kill
    7. if (faction _killed == "CIV_F") exitWith {
    8. hint format ["Ein Zivilist (%1) wurde von %2 getötet!", name _killed, name _killer];
    9. };
    10. }];
    Alles anzeigen

    Der hint kommt auch, also die Funktion ist richtig eingebunden.
    Nur ist der _killer (select 1) immer gleich der _killed (select 0). Er findet also den Spieler nicht.

    Hat vlt jemand einen Tipp für mich?
  • ace_medical_lastDamageSource ist nur auf der lokalen Maschine des Ziels definiert. Also kannste remote Events wie EntityKilled vergessen. Remote Execution > remote Events.
    Ich würde nicht die Variablen _killed und _killer verwenden, da zu ähnlich. Schlage _unit und _killer vor. Killed heißt schon das Event.
    Zeile 6 steigt bei kind != "Man" aus. Schlangen und Hasen (und Fische iirc) sind aber auch "Man". Da (und überall) muss CAManBase statt Man hin.

    Quellcode

    1. // init.sqf
    2. ["CAManBase", "Killed", {
    3. params ["_unit", "_killer"];
    4. _killer = _unit getVariable ["ace_medical_lastDamageSource", _killer];
    5. if (faction _unit == "CIV_F") exitWith {
    6. format ["Ein Zivilist (%1) wurde von %2 getötet!", name _unit, name _killer] remoteExec ["hint"];
    7. };
    8. }] call CBA_fnc_addClassEventHandler;
  • OK. Soweit erstmal Danke für die Erklärung.
    Auch die präsentierte Lösung funktioniert soweit.

    Jetzt hab ich mit dieser Lösung aber leider das Problem,
    dass gerechnete Zahlen (Count dead units) oder nach dem Tod erstellte holdActions von jeder Einheit gerechnet werden und nicht nur einmalig.
    Bekomme es auch mit if (!isServer) exitWith {}; nicht hin.

    Gibt es da vlt eine Methode, wie ich es nur einmalig ausführen lassen kann, sodass die Werte hinterher stimmen?
  • Der Killed wird nur auf einer Maschine (also "einmalig") ausgerführt. EntityKilled, das was du vorher benutzt hast, wird auf jeder Maschine ausgeführt.
    Ich kann nicht folgen was "Count dead units" bedeuten soll. Auch kann ich eine "holdActions" nicht finden und ich verstehe nicht was die rechnen soll.
    Wie gesagt, mit "kann ich es einmalig ausführen lassen" bist du auf dem Holzweg. Das Problem scheint ein anderes zu sein, aber mit meiner jetztigen Information kann ich das nicht lösen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von commy2 ()

  • Mit dem folgenden Code lasse ich die getöteten Zählen (Können jederzeit im OP-Bericht gesehen werden).
    Auch wird den Einheiten vorher zufällig irgend welches Zeug (Loot) in die Uniform gepackt, welches ich hier zufällig wieder löschen lasse.
    Außerdem wird den toten Civ's & IDAP's eine "Leichensack benutzen" Funktion (holdAction) gegeben.
    Zusätzlich betreiben wir noch ein Ziviles Reputations System (CRS), was Punkte für tote Civs abzieht.

    Dies funktioniert mit der alten Lösung bisher einwandfrei.
    Nur konnte ich da nie den _killer auslesen.

    Bei der neuen Version geht das wie gesagt. Da aber kann ich die ganzen anderen genannten Funktionen nicht laufen lassen,
    da ich, nachdem ich einen Civ getötet hatte, anstatt 1 Toten gleich 161 Tote im OP-Bericht stehen hatte.
    Ich hatte auch einen schier unendliche Anzahl (vermutlich auch 161) an holdActions "Leichensack benutzen" an dem Toten.
    Deshalb gehe ich davon aus, dass jede Einheit diese Funktionen ausgeführt hatte.

    Quellcode: init.sqf

    1. // DELETE WEAPONS, AMMO & GEAR
    2. addMissionEventHandler ["EntityKilled", {
    3. params ["_unit", "_killer", "_instigator"];
    4. private ["_gearList"];
    5. private _faction = faction _unit;
    6. // SWITCH FACTION
    7. switch _faction do {
    8. case "IND_F": {_gearList = [_unit, 5, 4, 2, 2, true, 0]};
    9. case "OPF_F": {_gearList = [_unit, 5, 4, 2, 2, true, 0]};
    10. case "OPF_T_F": {_gearList = [_unit, 5, 4, 2, 2, true, 0]};
    11. case "BLU_F": {_gearList = [_unit, 5, 4, 2, 2, true, 0]};
    12. case "BLU_T_F": {_gearList = [_unit, 5, 4, 2, 2, true, 0]};
    13. case "BLU_GEN_F": {_gearList = [_unit, 5, 4, 2, 2, true, 0]};
    14. case "IND_G_F": {_gearList = [_unit, 4, 3, 2, 2, false, 0]};
    15. case "IND_C_F": {_gearList = [_unit, 4, 3, 2, 2, false, 0]};
    16. case "OPF_R_F": {_gearList = [_unit, 4, 3, 2, 2, false, 0]};
    17. case "CIV_F": {_gearList = [_unit, 0, 0, 0, 0, false, 0]};
    18. case "CIV_IDAP_F": {_gearList = [_unit, 0, 0, 0, 0, false, 0]};
    19. };
    20. // REMOVE GEAR & COUNT KILLED
    21. if !(isPlayer _unit) then {_gearList call iV_fnc_removeGear};
    22. ["CountKilled", 1, _faction] call iV_fnc_handleNumbers; // RUN ON DEDICATED SERVER OR PLAYER HOST
    23. // IF CIV OR IDAP KILLED
    24. if (_faction == "CIV_F" || _faction == "CIV_IDAP_F") then {
    25. // HANDLE CRS & ADD BODYBAG ACTION
    26. ["CRSMinus", 15] call iV_fnc_handleNumbers; // RUN ON DEDICATED SERVER OR PLAYER HOST
    27. ["useBodyBag", _unit] call iV_fnc_holdAction; // RUN ON DEDICATED SERVER OR PLAYER HOST
    28. };
    29. }];
    Alles anzeigen


    Meine holdAction schaut z.B. so aus:

    Quellcode: fn_holdAction.sqf

    1. [
    2. _object,
    3. localize "STR_iV_UseBodybag",
    4. "images\holdactions\holdAction_bodybag_ca.paa",
    5. "images\holdactions\holdAction_bodybag_ca.paa",
    6. "_this distance _target < 2",
    7. "_caller distance _target < 2 && 'ACE_bodyBag' in items _caller && (_this getVariable ['ace_medical_medicClass', false]) == 2",
    8. {},
    9. {},
    10. {["BodyBag", _target] call iV_fnc_executeAction; _caller removeItem "ACE_bodyBag"},
    11. {},
    12. ["_object"],
    13. 10,
    14. nil,
    15. true,
    16. false
    17. ] remoteExec ["BIS_fnc_holdActionAdd", 0, _object];
    Alles anzeigen
  • Killed wird nur einmal ausgeführt, nicht 161 mal. Da ist was ganz anderes kaputt bei deinen Skripten. Da steht zum Beispiel mehrfach der Kommentar RUN ON DEDICATED SERVER OR PLAYER HOST. Aber offensichtlich ist das nicht der Fall, denn EntityKilled wird auf jeder verbundenen Maschine ausgeführt.

    In der fn_holdAction.sqf ist _object komplett undefiniert. Das kann überhaupt keine Aktion zu irgenwas hinzufügen.


    Also wenn du ein global ausgeführtes Killed-Event haben möchtest wie EntityKilled, nur mit der lastDamageSource von ACE, dann könnte man das so schreiben:

    Quellcode

    1. // init.sqf
    2. ["mission_killed", {
    3. params ["_unit", "_killer"];
    4. systemChat str ["K", name _unit, name _killer];
    5. }] call CBA_fnc_addEventHandler;
    6. ["CAManBase", "Killed", {
    7. params ["_unit", "_killer"];
    8. _killer = _unit getVariable ["ace_medical_lastDamageSource", _killer];
    9. ["mission_killed", [_unit, _killer]] call CBA_fnc_globalEvent;
    10. }] call CBA_fnc_addClassEventHandler;
    Alles anzeigen

    Und wenn dir das die gleiche Nachricht 161 mal in den Chat schreibt, dann wird deine init.sqf selbst 161 mal ausgeführt statt wie bei jedem sonst einmalig und das ist dann ein ganz grobes Ding in deiner Mission.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von commy2 ()