ARMA 3 - MISSION EDITING & SCRIPTING Arma 3 - Find closest player to marker
Arma 3 - Find closest player to marker
Quelle: Gametwitter.de Forum | views: 1003

Sorry, wenn ich mich hier eine englische Überschrift zum Thema verwende, jedoch finde ich es so angenehmer als es in Deutsch zu umschreiben.

In dem heutigen Beispiel geht es darum den Spieler zu finden, welcher zu einem bestimmten Marker am dichtesten sich befindet, um dann entsprechend in seine Richtung bzw. Position Feindkräfte zu entsenden.

Um sicherzustellen, das hierzu auch Bodeneinheiten als Ziel gewählt werden, überprüfe ich im Skript auch, ob sich der Spieler am Boden befindet. Des Weiteren überprüfe ich aus Performancegründen, die Feindanzahl bevor das Skript durchläuft. In der Regel gibt es in meinen Mission nicht mehr als 50-70 Gegner, daher die Begrenzung im Skript auf 60 Einheiten.

Aufgerufen wird das Skript als Funktionsaufruf, welcher den "Markernamen" an die Funktion übergibt. Der Aufruf kann als Bestandteil eines Skripts, über einen Trigger oder für einen Admin über die Console aufgerufen werden.

Der Aufruf sieht wie folgt dann aus:

["markername"]spawn GTcallEnemyAttackGroup;

Eingebunden wird das Skript in der initServer.sqf

call compile preprocessFileLineNumbers "GTscripts\GTcallEnemyAttackGroup.sqf";

Der Gesamtaufbau des Skript stellt sich dann so da:

GTcallEnemyAttackGroup = {


private _eastunits = east countSide allUnits;
private _marker = _this select 0;
private _markerPos = getMarkerPos _marker;
private _playerList = allPlayers apply {[_markerPos distanceSqr _x, _x]};
_playerList sort true;
private _closestPlayer = (_playerList select 0) param [1, objNull];


if ((isTouchingGround _closestPlayer && _eastunits < 60)) then{

   private _marker = _this select 0;
   private _markerPos = getMarkerPos _marker;
   private _playerList = allPlayers apply {[_markerPos distanceSqr _x, _x]};
   _playerList sort true;
   private _closestPlayer = (_playerList select 0) param [1, objNull];

   _grade = [390,210,270,330] call BIS_fnc_selectRandom;
   _startPos = [(getPos _closestPlayer), (500 + random 150), _grade] call BIS_fnc_relPos;

  _group = ["gm_gc_army_infantry_squad_str","gm_gc_army_sf_infantry_specops_str","gm_gc_army_infantry_squad_str"] call BIS_fnc_selectRandom;
  _eastgrp = [_startPos,EAST, (configfile >> "CfgGroups" >> "East" >> "gm_gc_army" >> "gm_infantry_80"  >> _group)] call BIS_fnc_spawnGroup;

{
   _x enableAI "PATH";
   _x setUnitPos "up";
} forEach units _eastgrp;


_eastgrp setCombatMode "RED";
//_leader = leader _eastgrp;


   while{(alive _closestPlayer)}do{
      _wp1 = _eastgrp addWaypoint [(getPos _closestPlayer), 0];
      _wp1 setWaypointType "Move";
      _wp1 setWaypointSpeed "Normal";
     _wp1 setWaypointBehaviour "AWARE";
     [_eastgrp, 2] setWaypointCompletionRadius 30;


     sleep 60;
     deleteWaypoint [_eastgrp, 2]
    };
};
};

Ps: Das Skript ist auf Gruppen aus dem GM Mod ausgerichtet. Die Zeilen

  _group = ["gm_gc_army_infantry_squad_str","gm_gc_army_sf_infantry_specops_str","gm_gc_army_infantry_squad_str"] call BIS_fnc_selectRandom;
  _eastgrp = [_startPos,EAST, (configfile >> "CfgGroups" >> "East" >> "gm_gc_army" >> "gm_infantry_80"  >> _group)] call BIS_fnc_spawnGroup;

müssten dann auf Euer Feindbild abgeändert werden. Diese findet ihr im "Configviewer" und CfgGroups des Arma Editors.

Eine Kommentarfunktion ist in diesem Blog nicht vorgesehen.
Bei Problemen zum Skript bitte im Gametwitter.de Forum registieren und dort die Kommentarfunktion nutzen.