Small_Bee
21.04.2011, 02:06
Как заставить работать родной радар, я не разобрался, так что попробовал реализовать свой.
Вот таким вот "коротенько, минут на сорок" (С), образом можно реализовать собственный "радар".
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 км.. Как только в радиус заходят синие самолеты, их координаты светятся в окне сообщений. Красные самолеты игнорируются. Первая группа хенкелей отрабатывает по радару. Если он уничтожается, сообщения прекращаются.
Вот таким вот "коротенько, минут на сорок" (С), образом можно реализовать собственный "радар".
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 км.. Как только в радиус заходят синие самолеты, их координаты светятся в окне сообщений. Красные самолеты игнорируются. Первая группа хенкелей отрабатывает по радару. Если он уничтожается, сообщения прекращаются.