Сервис плановых проверок бизнеса в Pawn

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

8

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

Зачем нужен
Когда на сервере сотни бизнесов, игроки часто забывают платить налоги, обновлять склад или обслуживать оборудование. Этот сервис запускает проверочные рейды, фиксирует нарушения и начисляет штрафы без ручного вмешательства админов.

Данные по бизнесу
Код:
enum BusinessAudit
{
    AuditBusinessID,
    AuditOwner[MAX_PLAYER_NAME],
    AuditLastCheck,
    AuditFine,
    AuditStatus,
    AuditNotes[96]
}

new AuditData[256][BusinessAudit];
new AuditCount;

Подготовка
При старте сервера загружаем все бизнесы и назначаем им дату следующей проверки.
Код:
LoadBusinessAudits()
{
    for(new i = 0; i < TotalBusinesses; i++)
    {
        new idx = AuditCount++;
        AuditData[idx][AuditBusinessID] = BusinessData[i][bID];
        GetBusinessOwner(i, AuditData[idx][AuditOwner], MAX_PLAYER_NAME);
        AuditData[idx][AuditLastCheck] = gettime();
        AuditData[idx][AuditFine] = 0;
        AuditData[idx][AuditStatus] = 0;
        AuditData[idx][AuditNotes][0] = '\0';
    }
}

Планировщик проверок
Каждый час выбираем часть бизнесов и прогоняем по чек-листу.
Код:
forward AuditScheduler();
public AuditScheduler()
{
    new now = gettime();
    for(new i = 0; i < AuditCount; i++)
    {
        if(now - AuditData[i][AuditLastCheck] < 3600)
            continue;

        RunAudit(i);
        AuditData[i][AuditLastCheck] = now;
    }
    return 1;
}

Чек-лист
Код:
RunAudit(idx)
{
    new b = AuditData[idx][AuditBusinessID];
    new violations = 0;

    if(BusinessData[b][bStock] < 50) violations++;
    if(BusinessData[b][bTaxDebt] > 0) violations++;
    if(!IsBusinessStaffOnline(b)) violations++;

    if(violations > 0)
    {
        new fine = violations * 5000;
        AuditData[idx][AuditFine] += fine;
        AuditData[idx][AuditStatus] = 1;
        format(AuditData[idx][AuditNotes], 96, "Нарушений: %d, штраф $%d", violations, fine);
        NotifyOwner(idx, fine);
    }
    else
    {
        AuditData[idx][AuditStatus] = 0;
        AuditData[idx][AuditNotes] = "Проверка пройдена";
    }
}

Уведомления
Код:
NotifyOwner(idx, fine)
{
    new owner[MAX_PLAYER_NAME];
    format(owner, sizeof owner, "%s", AuditData[idx][AuditOwner]);

    if(IsPlayerOnline(owner))
    {
        SendClientMessage(GetPlayerID(owner), 0xFF0000FF,
            "[AUDIT] Ваш бизнес получил штраф $%d. Оплатите его в течение суток.", fine);
    }
    else
    {
        LogOfflineMessage(owner, fine);
    }
}

Отчёт для админов
Команда `/auditlog` выводит 10 последних проверок, `/audits bID` — историю конкретного бизнеса. Сохраняйте записи в базу, чтобы можно было отследить системных нарушителей.

Советы
* Добавьте коэффициенты в зависимости от статуса бизнеса (VIP получает предупреждение вместо штрафа).
* Проверьте интеграцию с налоговой системой: если штраф не оплачен вовремя, бизнес блокируется.
* Для RP-серверов можно дополнить сценарий выездной проверкой: инспектор приезжает, собеседует персонал, и результат заносится в карточку.

Проверка
1. Создайте тестовый бизнес с пустым складом и просроченным налогом — убедитесь, что начисляется двойной штраф.
2. Попробуйте выполнить аудиты вручную через `/auditrun 15`, чтобы проверить реакцию системы.
3. Включите лог и проследите, что планировщик не пропускает бизнесы и не проверяет их чаще, чем раз в час.
 

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

Сверху