Spotter für Mörser

  • Vanilla
  • Spotter für Mörser

    Moinsen.
    Ich habe folgendes Problem. In einer Stadt steht ein Mörser. Per Script oder händisch, soll eine Anzahl x von Spottern platziert werden, welche einen Name zugeweisen bekommen. Also SP1 etc. pp. Das kann einer sein, dass können zehn sein. Ja nach dem, wie schwer man die Abwehr haben möchte.
    Haben die Spotter Kenntnis von Feinden, soll der Mörser feuern.
    Ich möchte das Script an den Mörser hängen. Ungefähr so
    [Mk1,[Sp1,Sp2,Sp3,Sp4] ] execVM "mortarDefense.sqf"

    Ich hänge bei der Abfrage fest.
    Zur Zeit bekomme ich es nur spotterbezogen hin und müsst diesem den Mörser zuweisen, welcher feuert. Damit hätte ich haber pro Spotter die ein Script und die wiederkehrenden Abfagen, was ich so nicht möchte.
    z.Z. mein Stand

    Quellcode

    1. private _spotter = _this;
    2. waituntil {sleep 10; {_spotter knowsabout _x > 0.9 && side _x == WEST} count allunits > 0 }
    3. ...
    4. erkannte Feinde in einen Array und zufällige Zuweisung für den Spotter
    5. bla bla Feuerbefehl für Mörser

    Wie muss die Abfrage lauten, wenn mindestens 1 Spotter von mindesten 1 feindlichen Einheit mehr als 0.9 weiß? Wie verschachtelt man eine count und eine forEach Abfrage?

    Mir ist klar, dass ich einen Trigger erstellen könnte, der anzieht, wenn Einheiten entdeckt wurden. Das will ich nicht, weil
    - Trigger prüft 2 pro Sekunden
    - Nur die Spotter haben "Funkverbindung" zum Mörser, nicht jeder x beliebige Fußsoldat.
    Gehirn ist keine Seife. Es wird nicht weniger, wenn man es benutzt!

    Beste Band der Welt

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Drunken Officer ()

  • Danke für den Denkanstoss. Ist sehr hilfreich.

    Doch doch, 0.9 ist schon richtig.
    Ich lasse den Mörser auf die Position schiessen. Per Random erweitere ich den Positionsradius, je geringer der Wert ist.
    Gehirn ist keine Seife. Es wird nicht weniger, wenn man es benutzt!

    Beste Band der Welt

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

  • Falls es mal jemand benötigt. Ich habe es für mich so geschrieben, dass die Spotter kurzfristig ihre Ziele verlieren, da Knowsabout zu lange seinen Wert behält und reval nur hochsetzen kann, nicht runter.
    Mit Sichtline wollte ich nicht arbeiten, da ich da mit einer Abfrage pro Frame hätte arbeiten müssen.

    An dieser Stelle danke an Commy für die Funktion mit dem Auslesen. (wieder was neues bezüglich dem select-Befehl gelernt)

    Quellcode

    1. /*
    2. Bei diesem Script muss ein Mörser auf der Karte stehen und es müssen Einheiten als Spotter gesetzt werden.
    3. Die Einheiten müssen benannt werden. z.B. Sp1, Sp2, Sp3
    4. Das Script wird an den Mörser angehanden. z.B. [this, [Sp1,Sp2,Sp3]] execVM "MortarDefenseWithSpotter.sqf"
    5. */
    6. if (!isServer) exitwith {};
    7. params
    8. [
    9. ["_mortar", objNull, [objNull]],
    10. ["_allSpotters", [], [[]]]
    11. ];
    12. //=== kontrolle ob Spotter angegeben wurden
    13. if ( count _allSpotters == 0) exitWith { systemChat "no spotters"};
    14. //=== wartet bis der Mörser geladen ist. Normalerweise lädt der immer Sprengmunition
    15. waitUntil { sleep 5; currentMagazine _mortar != ""};
    16. //=== Bestimmt das akutelle Magazin und wird später wegen der Aufmunitionierung benötigt
    17. private _currentMag = currentMagazine _mortar;
    18. //=== Hängt einen Eventhandler an. Vergibt dem Geschoss die Variable DOF_MortarBullet
    19. FiredEG = _mortar addEventHandler ["FIRED", { [WEST,"HQ"]commandChat "Achtung, Mörserfeuer!"; DOF_MortarBullet = (_this select 6) }];
    20. //==== Ermittelt alle Einheiten, welche Westlich (_enemies) sind. Nimmt das die Einheiten, welche den Spottern mit mehr als 1.6 bekannt sind
    21. //*****************
    22. // !! An dieser Stelle Danke an Commy für die Hilfe bei dieser Funktion !!
    23. //*****************
    24. private _fnc_enemiesKnownByAnySpotter =
    25. {
    26. private _enemies = allUnits select {side group _x == west};
    27. _enemies select { private _enemy = _x; selectMax (_allSpotters apply {_x knowsAbout _enemy}) > 1.6 }
    28. };
    29. private _targets = [];
    30. //==== LOOP, ob Mörser und Spotter vorhanden sind
    31. while { {alive _x} count _allSpotters > 0 && alive _mortar} do
    32. {
    33. waitUntil { sleep 5; _targets = call _fnc_enemiesKnownByAnySpotter; !(_targets isEqualTo []) };
    34. //==== Wählt das Ziel aus und läßt den Mörser auf die Position des Ziels schiessen
    35. private _target = selectRandom _targets;
    36. _mortar commandArtilleryFire [getpos _target, currentMagazine _mortar, 1];
    37. //==== Wartet bis geschoss existiert und dann bis es eingschlagen ist
    38. waituntil {sleep 3; !isNil "DOF_MortarBullet"};
    39. waitUntil {sleep 1; !alive DOF_MortarBullet };
    40. //==== Die Spotter verlieren ihre Ziele (knowsAbout bleibt zu lange erhalten!) der Array wird gelöscht. Durch die Schleife wird die Funktion erneut via call aufgerufen
    41. { _spotter = _x;{_spotter forgetTarget _X} forEach _targets} forEach _allSpotters;
    42. _targets = [];
    43. //==== Prüft ob das Magazin, welches zum Anfang vorhanden war, noch vorhanden nicht. Wenn nein, ein Verzögerung von 30 sekunden und neue Munition setzen.
    44. If ( {(_x select 0) == _currentmag } count (magazinesAmmo _mortar) == 0 ) then
    45. {
    46. SystemChat "REARM";
    47. sleep 30;
    48. _mortar setVehicleAmmo 1;
    49. };
    50. };
    Alles anzeigen
    Gehirn ist keine Seife. Es wird nicht weniger, wenn man es benutzt!

    Beste Band der Welt

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Drunken Officer ()