Alternativer "Sector Control" Spielmodus

    • Tut- Diskussionen

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

    • Alternativer "Sector Control" Spielmodus

      Hallo,

      Aus Langeweile habe ich heute ein Skript für eine Art eigenen "Sector Control"-Spielmodus geschrieben. Das Skript ist auf Performance ausgelegt, sollte also gut im MP funktionieren. Es benötigt der Einfachheit halber CBA, aber könnte auch mit ein paar hässlichen Work-arounds auf Vanilla umgeschrieben werden.



      Die Regeln sind einfach:
      Am Anfang sind alle Sektoren neutral. Befindet sich eine Blufor-Einheit im Sektor, dann bekommt Team Blau einen Punkt für jede Minute und jede Einheit. Das gleiche für Opfor.
      Befinden sich Einheiten von beiden Seiten im Sektor, dann läuft das ganze wie beim Tauziehen. Drei rote und zwei blaue Einheiten bedeuten einen Punkt für Team Rot pro Minute.
      Bei gleich vielen Einheiten pro Seite passiert nichts.
      Ab 5 Punkten wird der Sektor blau bzw. rot auf der Karte markiert. Es können bis zu 15 Punkte gesammelt werden, d.h. es wird schwieriger (zeitaufwändiger) für den Gegner, den Sektor zurückzuerobert, da die Punkte des Gegners erst abgebaut werden müssen.
      Die genauen Punktegrenzen können im Skript angepasst werden. Die Variablen heißen MAX_SCORE und NEUTRAL_SCORE_THRESHOLD.

      Eine Auswertung des ganzen am Missionsende habe ich noch nicht geschrieben. Genau so sehen die Spieler den Fortschritt im Moment nur auf der Karte. Das könnte aber bei Interesse noch relativ einfach hinzugefügt werden.

      Skripte
      Das hier muss in die description.ext:

      Für die Skripte müssen folgende Dateien im Missionshauptverzeichnis angelegt und richtig benannt werden.

      Die "Konfig" in der ein paar grundlegende Einstellungen für das System vorgenommen werden können (verbleibende Zeit, wie lange das Einnehmen eines Sektors dauert etc.).
      sectorsConfig.hpp


      Dieses Skript berechnet auf dem Server die Kontrolle der jeweiligen Seite über die Sektoren und synchronisiert Änderungen mit den Clienten und sorgt dafür, dass die Auswertung auf den Clienten angezeigt wird.
      initSectors.sqf


      Dieses Skript zeichnet auf allen Clienten die Sektoren auf die Karte.
      initSectorsMap.sqf


      Dieses Skript zeichnet den Score Bar des derzeitg besetzten Sektors, die Anzahl der kontrollierten Sektoren beider Seiten, und die verbleibende Zeit.
      initSectorsUI.sqf


      Und dann noch zwei Skripte für ein paar geometrische Berechnungen:

      getFaces.sqf


      triangulate.sqf

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

    • Sektoren erstellen

      Die Eckpunkte der Sektoren wurden durch Platzieren von Dummys im Editor generiert. Dafür werden z.B. Zivilisten verwendet.


      Die Dummys werden mit "Synch To" zu Feldern verbunden. Zur Feinjustierung können diese verschoben werden. Die Verbindungen dürfen sich nicht kreuzen.

      Dann öffnet man im Editor mit Strg + D die Debug-Konsole und schreibt:
      copyToClipboard str call compile preprocessFileLineNumbers "getFaces.sqf";
      und drückt "LOKAL AUSF.". Dann befinden sich die Sektoren in der Zwischenablage und können in der sectorsConfig.hpp hinter #define SECTORS eingefügt werden.

      Nach dem neu laden der Mission sieht das ganze so aus:


      Das Bild aus dem ersten Post habe ich erstellt, in dem ich je eine Einheit von Blufor oder Opfor in einige Sektoren versteckt habe, und fünft Minuten gewartet habe, bis genügend Punkte für das jeweilige Team gesammelt wurden.

      Sektoren am Beginn einem Team zuweisen

      Quellcode

      1. if (isServer) then {
      2. commy_sectors select 0 setVariable ["score", 15, true]; // Sector 1
      3. commy_sectors select 1 setVariable ["score", 15, true]; // Sector 2
      4. };

      Die Zahl der besetzten Sektoren kann mit den Variablen commy_westSectorCount und commy_eastSectorCount ausgelesen werden.

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

    • Gefällt mir sehr gut! Habe das Ganze gerade in einer kleinen Testmission ausprobiert und finde es sehr gelungen. Vielen Dank fürs Teilen! :thumbup:

      commy2 schrieb:

      Eine Auswertung des ganzen am Missionsende habe ich noch nicht geschrieben. Genau so sehen die Spieler den Fortschritt im Moment nur auf der Karte. Das könnte aber bei Interesse noch relativ einfach hinzugefügt werden.
      Interesse ist bei mir in jedem Fall vorhanden. Wäre klasse, wenn Du das bei Gelegenheit umsetzen könntest.
      Mir persönlich würden dafür globale Variablen reichen, mit denen abgefragt werden kann, wieviele Sektoren eine Seite aktuell erobert hat.
      Zusätzlich könnte man so auch eine Zeit festlegen, nach der die Mission auf jeden Fall endet. In dem Fall gewinnt dann die Seite mit den meisten eroberten Sektoren.

      Toll wäre natürlich auch, wenn die Spieler beim Betreten eines Sektors eine Anzeige (Display) am Bildschrimrand erhalten, die den aktuellen Status des Sektors ausgibt (Besitzer und Punkte).
      So können sie die verbleibende Zeit bis zum Einnehmen eines Sektors besser einschätzen, bzw. ob die Anzahl eigener Kräft im Sektor ausreicht, um diesen zu übernehmen.
    • Ich habe die beiden ersten Posts editiert. Jetzt werden die Sektoren live ausgewertet und eine verbleibende Spielzeit angezeigt.



      Auf diesem Bild sind 3 Sektoren von Blau eingenommen. Der derzeitige steht kurz vor der Einnahme. Es sind noch 23 Minuten verbleibenden.

      Außerdem habe ich mich die Woche mal in "Computational geometry" eingelesen, sodass die Sektoren jetzt nicht mehr manuell ausgelsen werden müssen, sondern über eine Zeile exportiert werden können. Das Skript dazu ist im zweiten Beitrag.
    • Hallo Commy!

      Habe es noch mal kurz getestet und finde die Umsetzung wirklich klasse!

      Ich habe den Timer bei mir etwas angepasst, weil er standardmäßig im Format HH:MM angezeigt wurde.
      Als Spieler würde ich die Zeit lieber im Format MM:SS sehen, besonders kurz vor dem Ende, falls es mal "knapp" wird, kommt so vielleicht etwas mehr Spannung auf.
      Daher habe ich folgende Änderung in der initSectorsUI.sqf vorgenommen:

      Quellcode: initSectorsUI.sqf

      1. private _timeLeft = floor ((MISSION_END_TIME*60) - CBA_missionTime) max 0;



      Einen Vorschlag hätte ich noch:
      Es wäre toll, wenn das Updateintervall für die Punktvergabe (Zeit pro Tick) in der sectorsConfig.hpp frei definiert werden könnte (in Sekunden).
      Standardäßig ist es eine Minute. Auf kleineren Maps mit wenigen Spielern (5 vs 5 CQB) könnte das jedoch etwas zu lang sein.
      Durch ein frei einstellbares Tick-Intervall könnte der Missionsersteller die Spielmechanik ganz leicht mit der Anzahl und größe der Sektoren skalieren lassen,
      oder einfach nur ganz allgemein den "Pace" der Mission erhöhen oder verringern.