- Версия мультиплеера
- SA:MP 0.3.7
- open.mp
SmartEvents
SA-MP/OMP плагин для управления временными событиями игроков: Mute, Jail, VIP и т.п.
SA-MP/OMP плагин для управления временными событиями игроков: Mute, Jail, VIP и т.п.
Как это работает
При создании события нужно указать:
- Название события
- Коллбек - вызывается один раз по истечении времени. Если оставшееся время больше 24 часов, коллбек не добавляется в очередь до следующего рестарта сервера, что оптимизирует производительность.
- Тип времени- есть два типа:
- false - offline: время истекает даже когда игрок не на сервере. Сохраняется один раз при выдаче события.
- true - online: время истекает только пока игрок на сервере. Сохраняется при выдаче и при каждом выходе игрока с сервера.
Защита от краша
Даже для онлайн-событий потеря данных при краше не страшна.
При получении события во временную таблицу записываются нужные данные, а при выходе игрока - удаляются.
Если сервер крашнуло, то данные там останутся.
При повторном запуске плагин проверяет временную таблицу, вычисляет разницу между сохранённым и текущим временем запуска и обновляет основную таблицу.
Требования
- Автоматический рестарт сервера раз в сутки (есть на всех нормальных серверах)
- Скрипт автоматического поднятия при краше (есть по умолчанию на всех хостингах, на VPS ставится вручную)
Хранение данных
Все данные хранятся в SQLite базе данных по пути scriptfiles/SmartEvents.db.
Интеграция
Вызовите две функции в вашем моде - одну после авторизации, другую после регистрации:
Pawn:
public OnPlayerLogin(playerid)
{
// Ваша загрузка аккаунта
cache_get_value_name_int(0, "ID", PlayerInfo[playerid][pID]);
SE_OnPlayerLogin(playerid, PlayerInfo[playerid][pID]);
}
public OnPlayerSignIn(playerid)
{
// Когда игрок зарегистрировался
PlayerInfo[playerid][pID] = cache_insert_id();
SE_OnPlayerSignIn(playerid, PlayerInfo[playerid][pID]);
}
Пример использования
Pawn:
new SE:gPlayerMute;
new SE:gPlayerJail;
public OnGameModeInit()
{
SE_SetLanguage("ru");
gPlayerMute = SE_AddEvent("mute", "OnMuteExpired", true); // online - только время в игре
gPlayerJail = SE_AddEvent("jail", "OnJailExpired", true); // online - только время в игре
}
CMD:mute(playerid, params[])
{
SE_SetPlayerEvent(targetid, gPlayerMute, SE_MinutesToSeconds(30));
SendClientMessage(targetid, -1, "Вам выдан мут на 30 минут");
}
CMD:unmute(playerid, params[])
{
SE_RemovePlayerEvent(targetid, gPlayerMute);
SendClientMessage(targetid, -1, "Ваш мут был снят");
}
CMD:jail(playerid, params[])
{
SE_SetPlayerEvent(targetid, gPlayerJail, SE_HoursToSeconds(1));
SendClientMessage(targetid, -1, "Вы посажены в jail на 1 час");
}
public OnPlayerText(playerid, text[])
{
if (SE_IsPlayerEventActive(playerid, gPlayerMute))
{
SendClientMessage(playerid, -1, "У вас мут");
return 0;
}
return 1;
}
public OnPlayerSpawn(playerid)
{
if (SE_IsPlayerEventActive(playerid, gPlayerJail))
{
SetPlayerPos(playerid, x, y, z);
}
return 1;
}
SE_Event:OnMuteExpired(playerid)
{
SendClientMessage(playerid, -1, "Время мута истекло");
}
SE_Event:OnJailExpired(playerid)
{
SetPlayerPos(playerid, x, y, z);
SendClientMessage(playerid, -1, "Время jail истекло");
}
Чем это лучше вычитания и сохранения каждую секунду?
- Запросы в БД: Tick & Save - каждую секунду на игрока / SmartEvents - при выдаче + при выходе
- Вызовы коллбека: Tick & Save - каждую секунду / SmartEvents - один раз по истечении
Benchmark
100 игроков с 5 часовым мутом и 15 реконектов на игрока (реконект только для плагина).

Документация: https://github.com/i...martEvents/wiki
Актуальная версия: https://github.com/i...Events/releases