Как заставить работать родной радар, я не разобрался, так что попробовал реализовать свой.
Вот таким вот "коротенько, минут на сорок" (С), образом можно реализовать собственный "радар".
Код:
using System;
using maddox.game;
using maddox.game.world;
using System.Collections.Generic;
using maddox.GP;
public class Mission : maddox.game.AMission
{
private const double RADAR_X = 170291.06; // положение радара по X;
private const double RADAR_Y = 188786.78; // положение радара по Y;
private const double RADAR_Z = -60; // положение радара по Z;
private const double RADIUS = 20000; // радиус радара, метры;
private const int CHECK_PERIOD = 10; // частота обновления радара, секунды;
private const int ARMY = 2; // чьи самолеты отслеживать (1 - красные, 2 - синие);
private Point3d radarPoint; // местоположение радара в понятном игре виде;
private bool radarDestroyed = false; // признак уничтожения радара;
private void serverMessage(string msg)
{
Player pl = GamePlay.gpPlayer();
Player[] players = { pl };
object[] args = { msg };
GamePlay.gpLogServer(players, msg, args);
}
public override void OnBattleStarted()
{
base.OnBattleStarted();
radarPoint = new Point3d(RADAR_X, RADAR_Y, RADAR_Z);
}
public override void OnTickGame()
{
base.OnTickGame();
if (!radarDestroyed)
{
if (Time.tickCounter() % (CHECK_PERIOD * 30) == 0)
{
lockTargets();
}
}
}
public override void OnTrigger(int missionNumber, string shortName, bool active)
{
base.OnTrigger(missionNumber, shortName, active);
if ("radarDestroyedTrigger".Equals(shortName) && active)
{
radarDestroyed = true;
GamePlay.gpGetTrigger("radarDestroyedTrigger").Enable = false;
serverMessage("Радар: скоропостижно скончался...");
}
}
private void lockTargets()
{
bool hasTargets = false;
foreach (AiAirGroup airGroup in GamePlay.gpAirGroups(ARMY))
{
Dictionary<AiAirGroup, int> groupsCounter = new Dictionary<AiAirGroup, int>();
foreach (AiActor groupMember in airGroup.GetItems())
{
if (groupMember is AiAircraft)
{
hasTargets = true;
if (RADIUS > groupMember.Pos().distance(ref radarPoint))
{
string msg =
String.Format("Радар: Самолет в квадрате {0}", GamePlay.gpSectorName(groupMember.Pos().x, groupMember.Pos().y));
serverMessage(msg);
}
}
}
}
if (!hasTargets)
{
serverMessage("Радар: цели не обнаружены");
}
serverMessage("Радар: пииик-пик!");
}
}
Это только "базовая реализация". Само собой, можно усложнять/совершенствовать.. Например вспомнив стереометрию, можно реализовать областью прослушивания не сферу, как выше, а например конус, и крутить его по сторонам...; ввести ограничения по высоте... Можно определять типы самолетов; сравнив координаты целей между двумя проходами, можно посчитать направление и скорость, поднять на перехват истребители или.. или... или.. Имея точную карту высот, реализовать мертвые зоны за возвышенностями и т.д. Варьировать точность определения количества самолетов и их типов от расстояния до "радара"... Выводить сообщения игрокам о целях выборочно, команде или всем сразу... Или вообще сделать радар передвижным. В общем дофига всего.
Реализованная миссия в аттаче.
Стоит радар, летят две группы хенкелей. раз в 10 секунд "радар" "сканирует" местность радиусом в 20 км.. Как только в радиус заходят синие самолеты, их координаты светятся в окне сообщений. Красные самолеты игнорируются. Первая группа хенкелей отрабатывает по радару. Если он уничтожается, сообщения прекращаются.