Активный
- Тема Автор
- #1
Зачем нужен
Когда на сервере десятки событий (пожары, гонки, рейды), администраторам важно видеть картину в одном месте. Этот модуль собирает ключевые сигналы (онлайн фракций, состояние экономики, активность ивентов) и выводит их через единую команду.
Структура данных
Регистрация виджетов
Обновление
Раз в 15 секунд дергаем обработчики и записываем свежие значения.
Примеры обработчиков
Интерфейс
Команда `/monitor` выводит краткую сводку.
Практические советы
* Добавьте виджет свободных слотов на ивент: когда их мало, админы смогут открыть дополнительную сессию.
* Фиксируйте время последнего обновления и подсвечивайте пункты, если данные устарели (например, нет лаунчера).
* Подключите логгер: каждые 5 минут сбрасывайте значения в файл, чтобы анализировать тенденции.
* Если список виджетов растёт, разбейте их на вкладки (экономика, безопасность, ивенты) и передавайте параметр `/monitor economy`.
Проверка
1. Вручную измените количество офицеров и убедитесь, что виджет обновляется.
2. Отключите один из обработчиков (уберите запись в массиве), посмотрите, как интерфейс реагирует на “нет данных”.
3. Добавьте тестовый виджет, который показывает пинг сервера, чтобы убедиться, что система подходит и для технических метрик.
Когда на сервере десятки событий (пожары, гонки, рейды), администраторам важно видеть картину в одном месте. Этот модуль собирает ключевые сигналы (онлайн фракций, состояние экономики, активность ивентов) и выводит их через единую команду.
Структура данных
Код:
enum MonitorWidget
{
WidgetTitle[32],
WidgetValue[64],
WidgetColor,
WidgetUpdated,
WidgetHandler[32]
}
new MonitorData[16][MonitorWidget];
new MonitorCount;
Регистрация виджетов
Код:
AddWidget(const title[], const handler[], color)
{
if(MonitorCount >= sizeof(MonitorData))
return -1;
new idx = MonitorCount++;
format(MonitorData[idx][WidgetTitle], 32, "%s", title);
MonitorData[idx][WidgetHandler] = handler;
MonitorData[idx][WidgetColor] = color;
MonitorData[idx][WidgetValue][0] = '\0';
MonitorData[idx][WidgetUpdated] = 0;
return idx;
}
Обновление
Раз в 15 секунд дергаем обработчики и записываем свежие значения.
Код:
forward MonitorTick();
public MonitorTick()
{
for(new i = 0; i < MonitorCount; i++)
{
CallLocalFunction(MonitorData[i][WidgetHandler], "i", i);
MonitorData[i][WidgetUpdated] = gettime();
}
return 1;
}
Примеры обработчиков
Код:
forward Widget_FractionOnline(idx);
public Widget_FractionOnline(idx)
{
new count = 0;
foreach(new i : Player)
{
if(PlayerInfo[i][pFaction] == LSPD)
count++;
}
format(MonitorData[idx][WidgetValue], 64, "%d офицеров на смене", count);
return 1;
}
forward Widget_EconomyState(idx);
public Widget_EconomyState(idx)
{
new total = 0;
foreach(new i : Player)
total += GetPlayerMoney(i);
format(MonitorData[idx][WidgetValue], 64, "$%d в обороте", total);
return 1;
}
Интерфейс
Команда `/monitor` выводит краткую сводку.
Код:
CMD:monitor(playerid, params[])
{
if(PlayerInfo[playerid][pAdmin] < 1)
return 0;
new buffer[1024];
for(new i = 0; i < MonitorCount; i++)
{
format(buffer, sizeof buffer, "%s{%06x}%s\n\\t%s\n",
buffer,
MonitorData[i][WidgetColor],
MonitorData[i][WidgetTitle],
MonitorData[i][WidgetValue]);
}
ShowPlayerDialog(playerid, DIALOG_MONITOR, DIALOG_STYLE_MSGBOX,
"Оперативный центр", buffer, "Закрыть", "");
return 1;
}
Практические советы
* Добавьте виджет свободных слотов на ивент: когда их мало, админы смогут открыть дополнительную сессию.
* Фиксируйте время последнего обновления и подсвечивайте пункты, если данные устарели (например, нет лаунчера).
* Подключите логгер: каждые 5 минут сбрасывайте значения в файл, чтобы анализировать тенденции.
* Если список виджетов растёт, разбейте их на вкладки (экономика, безопасность, ивенты) и передавайте параметр `/monitor economy`.
Проверка
1. Вручную измените количество офицеров и убедитесь, что виджет обновляется.
2. Отключите один из обработчиков (уберите запись в массиве), посмотрите, как интерфейс реагирует на “нет данных”.
3. Добавьте тестовый виджет, который показывает пинг сервера, чтобы убедиться, что система подходит и для технических метрик.