Как сделать проверки на включенный режим

Сообщения
182
Реакции
4
Code_0xABC, это я сделал перед тем как ты скинул

Актуальный код

C#:
#include <amxmodx>
#include <reapi>

// Режимы
#define NIGHT_MODE        // получаем бесплатно випку ночью
#define WEEKEND_MODE        // получаем бесплатно випку в выходные дни

// Флаги
#define GIVE_FLAG ADMIN_LEVEL_H        // какой флаг выдавать
#define HAVE_FLAG ADMIN_MENU        // кому не выдавать

new bool:is_night_bonus[MAX_CLIENTS+1], bool:is_weekend_bonus[MAX_CLIENTS+1];
new g_szActiveModeStr[64];

#define is_user_privilege(%1) (get_user_flags(%1) & HAVE_FLAG)

public plugin_init()
{
    register_plugin("Night & Weekend Bonus", "0.1", "Author");
    
    RegisterHookChain(RG_CBasePlayer_Spawn, "CBasePlayer_Spawn", true);
}

public client_disconnected(id)
{
    is_night_bonus[id] = false;
    is_weekend_bonus[id] = false;
}

public CBasePlayer_Spawn(id)
{
    #if defined NIGHT_MODE
    new szTime[3]
    get_time("%H",szTime,2)
    
    new iTime = str_to_num(szTime)
    if( 18 <= iTime <= 24 || 00 <= iTime <= 06)
    {
        if(!is_user_privilege(id))
        {
            remove_user_flags(id, ADMIN_USER);
            set_user_flags(id, GIVE_FLAG);
            is_night_bonus[id] = true;
            
            copy(g_szActiveModeStr, charsmax(g_szActiveModeStr), "Ночной режим");
            
            if(!is_user_alive(id))
                return;
            else    client_cmd(id, "vipmenu"); client_print_color(id, print_team_default, "^1Вам выдана бесплатная ^4VIP, ^1причина:^4 %s.", g_szActiveModeStr);
        }
    }
    else if(is_night_bonus[id])
    {
        remove_user_flags(id, GIVE_FLAG);
        set_user_flags(id, ADMIN_USER);
        is_night_bonus[id] = false;
    }
    #endif
    
    #if defined WEEKEND_MODE
    if(is_weekend())
    {
        if(!is_user_privilege(id))
        {
            remove_user_flags(id, ADMIN_USER);
            set_user_flags(id, GIVE_FLAG);
            is_weekend_bonus[id] = true;
            
            copy(g_szActiveModeStr, charsmax(g_szActiveModeStr), "Выходные дни");
            
            if(!is_user_alive(id))
                return;
            else    client_cmd(id, "vipmenu"); client_print_color(id, print_team_default, "^1Вам выдана бесплатная ^4VIP, ^1причина:^4 %s.", g_szActiveModeStr);
        }
    }
    else if(is_weekend_bonus[id])
    {
        remove_user_flags(id, GIVE_FLAG);
        set_user_flags(id, ADMIN_USER);
        is_weekend_bonus[id] = false;
    }
    #endif
}

#if defined WEEKEND_MODE
stock bool:is_weekend()
{
    new szTime[3];
    get_time("%u", szTime, charsmax(szTime));
    
    return str_to_num(szTime) > 3 ? true : false; // Поменял с 5 на 3 чтобы затестить на выходных режим
}
#endif
 
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
SlovePRO, и еще ты не учел это, допустим у игрока есть админка, а ты допустим если время не совпало, то отберешь у него флаг доступа. Надо при конекте игрока отсортировывать игроков с флагом, короче закешировать тех, у кого в дальнейшем будешь отбирать или давать админку
И не забудь про это, а то админки и випки твои слетят в выходной и дневное время
И stock кстате не надо проверять таким образом #if defined ....... #endif
 
Сообщения
182
Реакции
4
Code_0xABC, я пока далёк от этого но постараюсь найти пример и реализовать.
19 Май 2023
И stock кстате не надо проверять таким образом #if defined ....... #endif
Да, я понял это, сток подружается только если он нужен и можно обойтись без дефайнов
19 Май 2023
Пришла ко мне идея, а что если для каждого режима сделать отдельную функцию и вызывать эти функции в спавне игрока.
И там как раз может как-то сделать проверку на включенный режим.
 
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
Пришла ко мне идея, а что если для каждого режима сделать отдельную функцию и вызывать эти функции в спавне игрока.
И там как раз может как-то сделать проверку на включенный режим.
Непонятно, скорее всего это надо только для оптимизации и читабильности кода
 
Сообщения
182
Реакции
4
Code_0xABC, ну вот смотри:

C#:
if(is_weekend_bonus())
    return;
else is_night_bonus();
Разве работать не будет?
 
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
SlovePRO, то так, если я правильно понял
Код:
if(is_weekend_bonus()) { //сток
    //code
    return;
}

if(is_night_bonus()) { //сток
    //code
}
 
Сообщения
336
Реакции
414
Помог
7 раз(а)
Не тестировал

Код:
#include <amxmodx>
#include <reapi>

// Режимы
#define NIGHT_MODE        // Режим ночной випки
#define WEEKEND_MODE    // Режим выходной випки

// Флаги
#define GIVE_FLAG ADMIN_LEVEL_H        // Флаг, который выдается VIP'у
#define HAVE_FLAG ADMIN_MENU        // При наличии этого флага, не выдается VIP

new bool:g_bIsPlayerVIP[MAX_PLAYERS + 1];

public plugin_init() {
    register_plugin("Night & Weekend Bonus", "0.2", "Author");
   
    RegisterHookChain(RG_CBasePlayer_Spawn, "CBasePlayer_Spawn_Post", true);
}

public client_putinserver(id) {
    g_bIsPlayerVIP[id] = false;
}

public CBasePlayer_Spawn_Post(id) {
#if defined NIGHT_MODE
    if(UTIL_IsNightMode()) {
        if(!UTIL_IssueVIP(id, "Ночной режим"))
            return;
    }
    else if(g_bIsPlayerVIP[id])
        UTIL_RemoveVIP(id);
#endif
   
#if defined WEEKEND_MODE
    if(UTIL_IsWeekendMode()) {
        if(!UTIL_IssueVIP(id, "Выходные дни"))
            return;
    }
    else if(g_bIsPlayerVIP[id])
        UTIL_RemoveVIP(id);
#endif
}

stock bool:UTIL_IsNightMode() {
    new szTime[4];
    get_time("%H", szTime, charsmax(szTime));
   
    new iTime = str_to_num(szTime);
   
    return bool:(0 <= iTime <= 6 || 18 <= iTime <= 24);
}

stock bool:UTIL_IsWeekendMode() {
    new szTime[4];
    get_time("%u", szTime, charsmax(szTime));
   
    return bool:(str_to_num(szTime) > 5);
}

stock bool:UTIL_IssueVIP(const iPlayer, const szVipMode[]) {
    if(~get_user_flags(iPlayer) & HAVE_FLAG) {
        remove_user_flags(iPlayer, ADMIN_USER);
        set_user_flags(iPlayer, GIVE_FLAG);
        g_bIsPlayerVIP[iPlayer] = true;

        client_print_color(iPlayer, print_team_default, "^1Вам выдана бесплатная^4 VIP,^1 причина:^4 %s^1.", szVipMode);
       
        if(is_user_alive(iPlayer))
            client_cmd(iPlayer, "vipmenu");

        return true;
    }

    return false;
}

stock UTIL_RemoveVIP(const iPlayer) {
    remove_user_flags(iPlayer, GIVE_FLAG);
    set_user_flags(iPlayer, ADMIN_USER);
    g_bIsPlayerVIP[iPlayer] = false;
}
 
Последнее редактирование:
Сообщения
673
Реакции
242
Помог
11 раз(а)
Albertio,
UTIL_IsWeekendMode
%w День недели в числах ( вторник - 2)
 
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
Albertio,
UTIL_IsWeekendMode
%w День недели в числах ( вторник - 2)
Тоже самое, вернет 5 сегодня
Код:
stock UTIL_IsWeekendMode() {
    new szTime[4];
    get_time("%u", szTime, charsmax(szTime));

    return str_to_num(szTime);
}
Вот вывод в консоль
L 05/19/2023 - 20:53:37: -------- Mapchange to de_dust --------
[ReAimDetector] Version: 0.2.2 Windows 'Counter-Strike 1.6'
[ReAimDetector] Success: Build ReHLDS version defined Windows '2753'.
Executing ReGameDLL Configuration File
[AMXX] Loaded 0 admins from file
---- [5]
Executing AMX Mod X Configuration File
VAC secure mode disabled.
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
SlovePRO, серверное время соотвествует ночному режиму?
 
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
Потому что условие не верное
Код:
-if(!UTIL_IssueVIP(id, "Ночной режим"))
+if(UTIL_IssueVIP(id, "Ночной режим"))
Либо в самом стоке измерить
Код:
stock bool:UTIL_IssueVIP(const iPlayer, const szVipMode[]) {
    if(~get_user_flags(iPlayer) & HAVE_FLAG) {
        remove_user_flags(iPlayer, ADMIN_USER);
        set_user_flags(iPlayer, GIVE_FLAG);
        g_bIsPlayerVIP[iPlayer] = true;

        client_print_color(iPlayer, print_team_default, "^1Вам выдана бесплатная^4 VIP,^1 причина:^4 %s^1.", szVipMode);

        if(is_user_alive(iPlayer))
            client_cmd(iPlayer, "vipmenu");

        /*return true;*/
        return false;
    }

    /*return false;*/
    return true;
}
 
Последнее редактирование:
Сообщения
182
Реакции
4
Code_0xABC, помогло!
19 Май 2023
Код:
-if(!UTIL_IssueVIP(id, "Ночной режим"))
+if(UTIL_IssueVIP(id, "Ночной режим"))
 
Сообщения
182
Реакции
4
Code_0xABC, Albertio, поменял return bool:(str_to_num(szTime) > 5); на return bool:(str_to_num(szTime) > 3); и работает ночной режим, хотя по факту он еще не понимает что сейчас выходной день.
 
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
SlovePRO, с этим return bool:(str_to_num(szTime) > 3) будет срабатывать с четверга по воскресенье
 
Сообщения
182
Реакции
4
Code_0xABC, так это я понял, я изменил чтобы затестить если ночной режим не работает на выходных.
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу