Планировщик разведывательных дронов для нацгвардии

Активный
Статус
Сообщения
516
Лайки
32

8

месяц на сайте

Контекст
Штаб задает маршруты БПЛА, расписание и контролирует их выполнение одной командой. Решение используется оперативным штабом нацгвардии.

Функциональность
  • хранит до 16 заранее заданных пролетов
  • помогает выдавать задания операторам дронов
  • фиксирует длительность и координаты каждой миссии

Внедрение
  • соберите каталог точек разведки
  • опишите длительность и минимальную высоту
  • обучите операторов запускать шаблон
  • назначьте ответственного за обновление точек

Код
Код:
#include <a_samp>
#include <zcmd>
#include <sscanf2>

#define MODULE_TAG "NG_DRONE_SCHEDULER"
#define ROUTE_MAX 16

enum e_route
{
    bool:used,
    Float:x,
    Float:y,
    Float:z,
    duration
};
new NG_Routes[ROUTE_MAX][e_route];

stock NG_AssignRoute(playerid, slot)
{
    if(slot < 0 || slot >= ROUTE_MAX || !NG_Routes[slot][used]) return 0;
    SetPlayerCheckpoint(playerid, NG_Routes[slot][x], NG_Routes[slot][y], NG_Routes[slot][z], 8.0);
    new msg[96];
    format(msg, sizeof msg, "[%s] Дрону назначен маршрут #%d | %d мин.", MODULE_TAG, slot, NG_Routes[slot][duration]);
    SendClientMessage(playerid, 0x7FFFD4FF, msg);
    return 1;
}

CMD:droneplanng(playerid, const params[])
{
    SendClientMessage(playerid, 0xFFDAB9FF, "[%s] Маршруты БПЛА:", MODULE_TAG);
    for(new i = 0; i < ROUTE_MAX; i++)
    {
        if(!NG_Routes[i][used]) continue;
        new msg[128];
        format(msg, sizeof msg, "#%d -> %.1f %.1f %.1f | %d мин", i, NG_Routes[i][x], NG_Routes[i][y], NG_Routes[i][z], NG_Routes[i][duration]);
        SendClientMessage(playerid, 0xFFEFD5FF, msg);
    }
    return 1;
}

CMD:dronerunng(playerid, const params[])
{
    new action[8], slot, target, duration;
    new Float:x, Float:y, Float:z;
    if(sscanf(params, "s[8]", action)) return SendClientMessage(playerid, -1, "Используй: /dronerunng save/delete/assign ...");

    if(!strcmp(action, "save", true))
    {
        if(sscanf(params, "s[8]ifffi", action, slot, x, y, z, duration)) return SendClientMessage(playerid, -1, "/dronerunng save [слот] [x] [y] [z] [мин]");
        NG_Routes[slot][used] = true;
        NG_Routes[slot][x] = x;
        NG_Routes[slot][y] = y;
        NG_Routes[slot][z] = z;
        NG_Routes[slot][duration] = duration;
        SendClientMessage(playerid, 0x32CD32FF, "[%s] Маршрут #%d сохранен.", MODULE_TAG, slot);
    }
    else if(!strcmp(action, "delete", true))
    {
        if(sscanf(params, "s[8]i", action, slot)) return SendClientMessage(playerid, -1, "/dronerunng delete [слот]");
        NG_Routes[slot][used] = false;
        SendClientMessage(playerid, 0xFF4500FF, "[%s] Маршрут #%d очищен.", MODULE_TAG, slot);
    }
    else if(!strcmp(action, "assign", true))
    {
        if(sscanf(params, "s[8]ii", action, slot, target)) return SendClientMessage(playerid, -1, "/dronerunng assign [слот] [оператор]");
        if(!NG_AssignRoute(target, slot)) SendClientMessage(playerid, 0xDC143CFF, "[%s] Слот не готов.", MODULE_TAG);
    }
    return 1;
}

Тест-кейсы
  • создайте три маршрута и убедитесь что они сохраняются
  • попробуйте удалить маршрут и проверить освобождение слота
  • запустите вылет и контролируйте координаты на миникарте

Эксплуатация
  • сверяйте геозоны с картой ограничений полетов
  • ежедневно архивируйте flown-логи
  • переутверждайте длительность миссий еженедельно
  • отчеты автоматически попадают в нацгвардия
 

1 человек читают эту тему (Всего: 1, Пользователей: 0, Гостей: 1)

Сверху