Abfragen von Feind im Eventhandler

  • Multiplayer

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

Hilf mit, die Ausbreitung des Coronavirus einzudämmen.

Zum Bundesministerium für Gesundheit

  • Abfragen von Feind im Eventhandler

    Ich habe per Random ein paar Zivilisten zu Feinden (Gruppe EAST) erklärt und ihnen Waffen gegeben.
    Nun ist es aber so, dass das Töten von Zivilisten bei uns bestraft wird. Das soll bei "uns feindlich gesinnten" natürlich nicht passieren.
    Das detektieren von Toden regeln wir über den "Killed" Eventhandler. Welche Möglichkeiten habe ich, um das zu lösen?


    1. Wenn ich die Seite von "CIV_F" abfrage, ist diese immer CIVILIAN.
    2. Das Abfragen der Seite der Gruppe funktioniert im "Killed" EH leider auch nicht.
    3. Dann habe ich es noch mit einer Variablen versucht. Das sah wie folgt aus:

    Quellcode

    1. if (side _target == EAST) then {_target setVariable ["iV_isEnemy", true]};


    Und im Eventhandler dann...

    Quellcode

    1. private _isEnemy = _unit getVariable "iV_isEnemy";
    2. ...
    3. // IF CIV OR IDAP KILLED
    4. if (_faction == "CIV_F" || _faction == "CIV_IDAP_F" && !(_isEnemy)) then {...};

    Aber auch damit hat es nicht funktioniert.
    Über einen Tipp würde ich mich sehr freuen.
  • Das hatte ich auch schon überlegt, aber wir haben mittlerweile auch bewaffnete "CIV_F", die uns nicht feindlich oder verbündet sind.
    Da fällt das alleinige Abfrage nach einer Waffe leider raus. Außerdem werden Langwaffen doch im WeaponHolder abgelegt oder nicht?
    Wüsste gerade auch nicht genau, wie ich das dannn sauber der Person zuordbar umsetzen kann.


    Dann hätte ich noch einen globalen Array in den ich alle feindlichen Kräfte packen könnte.
    Ich vermute mal, dass dies funktionieren würde, nur mache ich mir da sorgen wegen der Performance. Es könnten bis zum nächsten Restart (Server oder Mission) schon ein paar Tage vergehen, was den Array ziemlich voll machen würde. Und ein vernünftiges Event zum leeren des Arrays habe ich, neben "keiner auf dem Server" und "Einheit getötet" auch nicht. Dazu kommt noch, dass wir mit ALiVE arbeiten und ich nicht weiss, ob ein gedespawnter Civ, wenn er wieder in Reichweite kommt und wieder spawned der gleiche ist oder ob dafür ein neuer erstellt wird. Und ich nutze einen HC und hätte da wohl Probleme den Array zu kommunizieren, ohne das ich allen Spielern diesen zukommen lassen muss (publicVariable "iV_civEnemys").


    Hmmm...
  • >Da fällt das alleinige Abfrage nach einer Waffe leider raus. Außerdem werden Langwaffen doch im WeaponHolder abgelegt oder nicht?

    Killed Event löst vor dem Abwerfen der Waffe aus. Allerdings kann ich nicht für Blödsinn wie MPKilled und EntityKilled sprechen; da wird es wahrscheinlich mehr oder weniger zufällig sein.

    Statt einem Array könnte man auch eine Variable ins Object-Namespace setzen. setVariable/getVariable.
  • OK. Ich habe das jetzt nochmal mit der Variable auf dem Object versucht.
    Diesmal scheint es zu funktionieren. Keine Ahnung, was ich vorher falsch gemacht habe.
    Vielleicht weil die nicht public gemacht wurde?


    Ich habe aber ein Problem, dass manchmal die Kills doppelt gerechnet werden.
    Ich nutze dafür den "Killed" EH und den in einem CBA_fnc_addClassEventHandler auf "CAManBase" in der init.sqf.



    Der Code schaut wie folgt aus...



    init.sqf

    ["CAManBase", "Killed", {[_this select 0] call iV_fnc_unitKilled}, true, [], true] call CBA_fnc_addClassEventHandler;


    fn_unitKilled.sqf

    Quellcode

    1. // VARIABLES
    2. params ["_unit", "_killer", "_instigator"];
    3. private ["_gearList"];
    4. _killer = _unit getVariable ["ace_medical_lastDamageSource", _killer];
    5. private _faction = faction _unit;
    6. // IF INSTIGATOR NOT FOUND (IN CASE OF ROADKILL)
    7. if (isNull _instigator) then {_instigator = _killer};
    8. // SWITCH FACTION
    9. switch _faction do {
    10. case "IND_F": {_gearList = [_unit, 7, 7, 5, 4, 7, 0]};
    11. case "OPF_F": {_gearList = [_unit, 7, 7, 5, 4, 7, 0]};
    12. case "OPF_T_F": {_gearList = [_unit, 7, 7, 5, 4, 7, 0]};
    13. case "BLU_F": {_gearList = [_unit, 7, 7, 5, 4, 7, 0]};
    14. case "BLU_T_F": {_gearList = [_unit, 7, 7, 5, 4, 7, 0]};
    15. case "BLU_GEN_F": {_gearList = [_unit, 7, 7, 5, 4, 7, 0]};
    16. case "IND_G_F": {_gearList = [_unit, 7, 6, 5, 3, 0, 0]};
    17. case "IND_C_F": {_gearList = [_unit, 7, 6, 5, 3, 0, 0]};
    18. case "OPF_R_F": {_gearList = [_unit, 7, 6, 5, 3, 0, 0]};
    19. case "CIV_F": {_gearList = [_unit, 0, 0, 0, 0, 0, 0]};
    20. case "CIV_IDAP_F": {_gearList = [_unit, 0, 0, 0, 0, 0, 0]};
    21. };
    22. // HANDLE PLAYER KILLED
    23. if (isPlayer _unit) then {[_unit] call iV_fnc_playerKilled};
    24. // REMOVE GEAR & COUNT KILLED
    25. if !(isPlayer _unit) then {_gearList call iV_fnc_removeGear};
    26. ["CountKilled", 1, _faction] remoteExec ["iV_fnc_handleNumbers", 2, false];
    27. // IF CIV OR IDAP KILLED BY PLAYER
    28. if (isPlayer _killer && {_faction in ["CIV_F", "CIV_IDAP_F", "BLU_F", "BLU_T_F", "BLU_GEN_F"]}) then {
    29. [_faction, _unit, _killer] remoteExec ["iV_fnc_handleWrongKill", 2, false];
    30. };
    Alles anzeigen

    Meine Funktion iV_handleWrongKill wird in diesem Fall dann auch 2x ausgeführt, weshalb ich der Meinung bin, dass der EH 2x feuert.
    Kann das denn sein? Mache ich da was falsch?
    Es passiert, wie gesagt, aber nicht bei jedem Kill.

  • Um nochmal auf den Vorschlag mit der Variable auf der Leiche zur Absicherung zurück zu kommen.
    Meinst du einfach folgendes in oben den "Killed" EH schreiben:

    Quellcode

    1. // CHECK IF UNIT IS ALREADY HANDLED
    2. private _isDead = _unit getVariable "iV_isDead";
    3. if (!isNil "_isDead") exitWith {diag_log text "[URBAN CONFLICTS] Killed EH - STOP WORKING TWICE"};
    4. _unit setVariable ["iV_isDead", true, true];
  • Klar. Musst nur beachten, dass beim Respawn (nur relevant für spielbare Einheiten) diese Variable von der Leiche zur Reinkarnation kopiert wird. Also müsste in so einem Fall die Variable via Respawn EH wieder auf nil gesetzt werden. Damit Respawn garantiert nach Killed ausgeführt wird, muss außerdem die respawnTime größer 0 sein. Aber wie gesagt, das ist nur relevant für spielbare Einheiten.
  • Mit respawnTime meinst du z.B. respawndelay aus der description.ext?



    Habe das nochmal angepasst, damit alles in der RPT des Servers und nicht beim HC oder den Spielern landet.

    Quellcode

    1. // CHECK IF UNIT IS ALREADY HANDLED
    2. private _isDead = _unit getVariable "iV_isDead";
    3. if (!isNil "_isDead") exitWith {
    4. text "[URBAN CONFLICTS] Killed EH - STOP WORKING TWICE" remoteExec ["diag_log", 2, false];
    5. if (!isMultiplayer) then {hint "STOP Killed EH"};
    6. };
    7. _unit setVariable ["iV_isDead", true, true];
    Alles anzeigen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von iV Ghost ()