Мобильный кризисный штаб в Pawn

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

8

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

Идея
Когда на сервере вспыхивает ЧС (пожар, массовый DM, падение FPS), админская команда должна быстро собрать данные и отработать сценарий. Модуль кризисного штаба автоматически строит “карточку происшествия”, назначает ответственных и запускает чек-лист действий.

Карточка происшествия
Код:
enum IncidentInfo
{
    IncidentTitle[48],
    IncidentReporter[24],
    IncidentLocation[32],
    IncidentSeverity,
    IncidentStatus,
    IncidentCreated,
    IncidentNotes[128],
    IncidentOwner
}

new IncidentLog[16][IncidentInfo];
new IncidentCount;

Регистрация происшествия
Код:
int CreateIncident(const title[], const reporter[], const loc[], severity)
{
    if(IncidentCount >= sizeof IncidentLog)
        return -1;

    new idx = IncidentCount++;
    format(IncidentLog[idx][IncidentTitle], 48, "%s", title);
    format(IncidentLog[idx][IncidentReporter], 24, "%s", reporter);
    format(IncidentLog[idx][IncidentLocation], 32, "%s", loc);
    IncidentLog[idx][IncidentSeverity] = severity;
    IncidentLog[idx][IncidentStatus] = 0; // 0 — открыто
    IncidentLog[idx][IncidentCreated] = gettime();
    IncidentLog[idx][IncidentOwner] = -1;
    IncidentLog[idx][IncidentNotes][0] = '\0';
    return idx;
}

Назначение ответственного
Код:
AssignIncident(idx, playerid)
{
    if(idx < 0 || idx >= IncidentCount)
        return 0;
    IncidentLog[idx][IncidentOwner] = playerid;
    format(IncidentLog[idx][IncidentNotes], 128,
        "%sПринято администратором %s\n",
        IncidentLog[idx][IncidentNotes],
        GetAdminNick(playerid));
    return 1;
}

Чек-лист действий
Для каждого типа происшествия создаём скрипт.
Код:
forward CrisisRoutine_Fire(idx);
public CrisisRoutine_Fire(idx)
{
    SendToFireDept(IncidentLog[idx][IncidentLocation]);
    FreezeNearbyPlayers(IncidentLog[idx][IncidentLocation], 15.0);
    BroadcastToAdmins("[FIRE] Штаб активирован, ближайшие игроки заморожены.");
    return 1;
}

Командный интерфейс
`/crisis` — список всех карточек, `/crisis new` — создать новую, `/crisis take 3` — взять на себя третью.

Код:
CMD:crisis(playerid, params[])
{
    if(isnull(params))
    {
        ShowIncidentList(playerid);
        return 1;
    }
    if(!strcmp(params, "new", true))
    {
        return StartIncidentDialog(playerid);
    }
    if(!strfind(params, "take ", true))
    {
        new idx = strval(params[5]);
        AssignIncident(idx, playerid);
        return 1;
    }
    return 1;
}

Визуализация
* Включите TextDraw с основными метриками: число открытых карточек, количество критических (severity >= 3), кто сейчас “дежурный”.
* Админы с мобильного клиента могут получать inline-уведомления через IRC/Discord вебхуки.

Советы по эксплуатации
1. Записывайте итог: как закрыли, какие санкции выдали. Эти данные пригодятся для отчётов.
2. Разделите карточки по типам (техничка, поведенческая, геймплей) и держите свои чек-листы.
3. Для крупных ивентов можно заранее подготовить шаблон карточки (например, “Концерт сорвался”).

Тест
* Создайте карточку “Оптимизация FPS”. Пусть ответственный проверит лог, сделает рестарт стримера, отметит в карточке результат.
* Сделайте имитацию пожара в ЛС. Убедитесь, что команда `CrisisRoutine_Fire` замораживает игроков и шлёт уведомления.
* Попробуйте параллельно держать несколько карточек, чтобы проверить устойчивость массива (при закрытии заменяйте запись последней, чтобы не образовывались дыры).
 

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

Сверху