Jump to content
Tactical Stealth Squad

Cigar0

Members
  • Content Count

    137
  • Benutzer seit

  • Letzter Besuch

Beiträge posted by Cigar0


  1.  

    =TSS= Headless Client Framework (HCF)


    c25t785.jpg

    by: .:NemesisoD:. & Brainslush
    Ideen von zinki

    Funktion

    Damit jeder Missionsbauer sehr einfach in seinen Missionen auf das HCF zurückgreifen kann möchte ich hier kurz erklären wie dieses Funktioniert:

    Was macht ein Headless Client?

    Ein Headless Client (kurz HC) ist prinzipiell ein ganz normaler Spieler, welcher lediglich kein Interface, d. h. keine Grafikausgabe, besitzt. Er wird dazu eingesetzt um die AI vom Server zu übernehmen, damit dieser sich auf die Verwaltung von Spielern und dem Missionsablauf kümmern kann. Dadurch ist es möglich deutlich mehr AI zu positionieren, welche gleichzeitig auch noch viel agiler ist. Es ist auch möglichen Berechnungen auf den/die HC/s auszulagern, was aber auf Grund mancher Probleme mit HCs (z. B. Disconnects), nicht ratsam ist. In der Regel laufen die HCs auf dem selben Hardware wie der Server. Der Grund dafür liegt daran, dass Arma nicht in der Lage ist mehr als zwei Kerne mit mehr als 50% auszulasten. Bei einem 8-Kern CPU kann man also somit bedenkenlos 4HCs mitlaufen lassen.


    Grundsätzlich: Ein oder mehrer HCs bringen ein Performancevorteil. Aber man sollte abwägen, ob es immer sinnvoll ist. Bei einer 5 Mann Mission mit vllt. 50 AI Gegner, ist es eher sinnfrei.

    Vorbereitung

    Um überhaupt HCs in der Mission verwenden zu können, müssen wir daher diesen Slots bereitstellen. Dazu stellen wir beim =TSS= 4 HC-Slots bereit.

    Um einen HC Slot hinzuzufügen platzieren wir im Editor eine neue Einheit:
    Side: Game Logic
    Class: Virtual Entities
    Unit: Headless Client
    Name: HC_1, HC_2, etc.

    Diese Einheit setzen wir "Playable"/"Spielbar" und fertig.

    Der Headless Client wird sich in der Slotliste automatisch auf einen dieser Slots platzieren.

    Einrichten

    Um das HCFramework zu nutzen gibt es drei Möglichkeiten.

    1. Editormodule: Paket: hcf_core

    Brain hat ingesamt 3 Module zur Verfügung gestellt:
    "Enable Group Transfer" Modul: Wenn Ihr dieses gesetzt habt, werden alle gesetzten Units auf die HCs gleichmäßig aufgeteilt.
    Ausnahme: Units die synchronisierte Waypoints besitzen oder mit dem "Disable Transfer" Modul synchronisiert sind
    "Enable Debug" Modul: Wenn das Modul gesetzt ist, schreibt es in die RPTs der HCs, Server und der Spieler alle 5 Sekunden eine Zeile, in der ersichtlich ist, wie viele KI vorhanden ist und wer wie viel zu händeln hat.


    2. Spawnen von Einheiten: Paket: hcf_spawn

    Empfehlung: Installiert euch die Poseidon Tools um Überischt bei der Befehlerstellung zu behalten. Die "[" und "]" werden recht viele!

    Eine Möglichkeit ist es Einheiten direkt auf einen HC spawnen zu lassen, dazu wird folgender Befehl benötigt:
    handle = [[spawnPos, Side, units],["TASK",["Paramter"]]] spawn tss_hcf_fnc_spawngroup;
    Wobei die Parameter wie folgt aussehen:
    • handle: Ein Scripthandle braucht ihr nur, wenn ihr den Aufruf in einem Trigger verwendet (kennen die Meisten als "nul =").
    • SpawnPos: Position an der die Gruppe Spawnt (z.B. getMarkerPos "mk_spawnpoint" oder getPos Objectname)
    • side: Die Seite zu der die Gruppe gehört (z.B. EAST, WEST, etc.)
    • units: Array mit den Classnames der Einheiten, oder die config der Gruppe (z.B. ["rhs_vdv_rifleman","rhs_vdv_rifleman"] oder (configfile >> "CfgGroups" >> "Indep" >> "IND_F" >> "Infantry" >> "HAF_InfTeam") oder ein Multidimensionales Array*)
     
    Der zweite Teil des Befehls ist gesplittet in den "TASK" und die dafür nötigen Parameter:


    *Was sind multidimensionale Arrays und was will der Autor überhaupt damit?
    Was ist das:
    Ein multidimensionales Array ist ein Array in dem verschiedene Arrays sind (https://community.bistudio.com/wiki/Array#Multi-dimensional_arrays).
    Was will der Autor damit:
    An einem Beispiel wird es schnell klar:
    [[getMarkerPos "area2", resistance, ["LOP_ISTS_Infantry_TL", "LOP_ISTS_Infantry_AT", "LOP_ISTS_Infantry_AR", "LOP_ISTS_Infantry_AT_Asst", "LOP_ISTS_Infantry_AR_Asst", "LOP_ISTS_Infantry_Rifleman", "LOP_ISTS_Infantry_Rifleman", "LOP_ISTS_Infantry_GL" , "LOP_ISTS_Infantry_GL" , "LOP_ISTS_Infantry_GL" , "LOP_ISTS_Infantry_GL"]], ["UPSMON", ["area2","NOVEH2","NOFOLLOW","RANDOM","COLUMN","SAFE","LIMITED"]]] spawn tss_hcf_fnc_spawnGroup;
    Wie man vllt. erkennen kann, ist der Aufruf ellenlang und man kapiert nichts mehr! Daher habe ich für den Parameter units ein Array erstellt in dem die verschieden Arrays der Gruppen gespeichert sind:
    GUERGroup = [
    	// Infantry (GUERGroup select 0)
    	["LOP_ISTS_Infantry_TL", "LOP_ISTS_Infantry_Rifleman", "LOP_ISTS_Infantry_AT", "LOP_ISTS_Infantry_AR_Asst", "LOP_ISTS_Infantry_AR"],
    	// Range Infantry (GUERGroup select 1)
    	["LOP_ISTS_Infantry_TL", "LOP_ISTS_Infantry_Rifleman_2", "LOP_ISTS_Infantry_GL", "LOP_ISTS_Infantry_Marksman", "LOP_ISTS_Infantry_GL"],
    	// Medium Infantry (GUERGroup select 2)
    	["LOP_ISTS_Infantry_TL", "LOP_ISTS_Infantry_Rifleman", "LOP_ISTS_Infantry_AT", "LOP_ISTS_Infantry_Rifleman_2", "LOP_ISTS_Infantry_AR"],
    	// Heavy Infantry (GUERGroup select 3)
    	["LOP_ISTS_Infantry_TL", "LOP_ISTS_Infantry_AT", "LOP_ISTS_Infantry_AR", "LOP_ISTS_Infantry_AT_Asst", "LOP_ISTS_Infantry_AR_Asst"],
    	// Leight Infantry (GUERGroup select 4)
    	["LOP_ISTS_Infantry_TL", "LOP_ISTS_Infantry_Rifleman", "LOP_ISTS_Infantry_Rifleman", "LOP_ISTS_Infantry_GL", "LOP_ISTS_Infantry_Rifleman_2"],
    	// AT Trupp (GUERGroup select 5)
    	["LOP_ISTS_Infantry_AT", "LOP_ISTS_Infantry_AT_Asst"]
    ];
    Dieses Script rufe ich einmal in der init.sqf auf:
    if (isServer) then {
             [] execVM "scripts\guerGroup.sqf";
    };
    Da ich nun ein multidimensionales Array habe, in dem alle meine Gruppen gespeichert sind, kann ich per "select X" die verschiedenen Gruppen in jedem Trigger und Script (solange vom Server gesteuert) verwenden. Dadurch wird mein Anfangsbeispiel kürzer und übersichtlicher:
    [[getMarkerPos "area2", resistance, (GUERGroup select 1)], ["UPSMON", ["area2","NOVEH2","NOFOLLOW","RONDOM","COLUMN","SAFE","LIMITED"]]] spawn tss_hcf_fnc_spawnGroup;

    3) Spawnen von Einheiten als Zeus: Paket: hcf_zeus

    Insgesamt verfügt dieses Paket über drei Module:
    Enable Group TransferDisable Group TransferTransfer Group to HC
    Wenn diese Modul gesetzt wird, werden alle künftigen durch den Zeus gesetzten Einheiten an den HC oder Server übertragenDieses Modul deaktiviert die Funktion, dass alle künftigen durch den Zeus gesetzten Einheiten  automatisch an den HC oder Server übetragen werdenDieses Modul kann man nur auf eine Gruppe oder einzelne Einheit anwenden. Die betroffene Einheit wird an den HC oder Server übergeben
×