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

Сообщения
174
Реакции
5
Здравствуйте ребята!

Искал на просторах интернета плагин который бы выдавал привилегию ночью и в выходные дни.
Нашел один вариант но он не подошёл по коду. В итоге взялся за написание с нуля. Нашёл пару стоков, пару примеров и понеслась.
Плагин работает, но вот только возник прикол:
- если включён ночной режим и режим на выходных то неправильно даётся флаг, точнее он отбирается.

Можете пожалуйста подсказать как правильно добавить проверки на режимы.
Ну и конечно советы по коду тоже был бы рад услышать!


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(!(6 <= iTime <= 18))
    {
        if(!is_user_privilege(id))
        {
            remove_user_flags(id, GIVE_FLAG);
            set_user_flags(id, ADMIN_USER);
            is_night_bonus[id] = false;
        }
    }
    else
    {
        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);
        }
    }
    #endif
    
    #if defined WEEKEND_MODE
    new iDay;
    is_weekend(iDay);
    
    if(iDay == 6 || iDay ==7)
    {
        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
    {
        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(&day = 0)
{
    new szTime[3];
    get_time("%u", szTime, charsmax(szTime));
    
    if (!(1 < (day = str_to_num(szTime)) < 7))
        return true;
    
    return false;
}
#endif
 
Сообщения
775
Реакции
291
Помог
11 раз(а)
SlovePRO, лень с телефона читать код. Но судя из вопроса, создаём булевую и натив , после чего можем юзать натив в других плагинах и делать нужные махинации
 
Сообщения
775
Реакции
291
Помог
11 раз(а)
SlovePRO, если только в вашем плагине, то хватит булевой
 
Сообщения
956
Реакции
51
Помог
10 раз(а)
SlovePRO, в спавне при выдачи в определенное время, после выдачи допиши ретурн, дальше функция не будет работать если условие совпадет и ниже тебе не нужно, проверяй на коннект и до того как присваиваешь флаг игроку
Код:
if(!is_user_alive(id))
    return
 
Последнее редактирование:
Сообщения
174
Реакции
5
Code_0xABC, типа так?

C#:
#if defined NIGHT_MODE
    new szTime[3]
    get_time("%H",szTime,2)

    new iTime = str_to_num(szTime)
    if(!(6 <= iTime <= 18))
    {
        if(!is_user_privilege(id))
        {
            remove_user_flags(id, GIVE_FLAG);
            set_user_flags(id, ADMIN_USER);
            is_night_bonus[id] = false;
        }
    }
    else
    {
        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);
            
            return;
        }
    }
    #endif
 
Сообщения
956
Реакции
51
Помог
10 раз(а)
SlovePRO, а зачем тебе native remove_user_flags ?
18 Май 2023
А ты случайно не проверяешь когда в спектрах или мертв??
18 Май 2023
SlovePRO, а зачем тебе native remove_user_flags ?
18 Май 2023
А ты случайно не проверяешь когда в спектрах или мертв??
И если нетрудно пока жи мне это значение log_amx("'''' [%i]", !(6 <= iTime <= 18)), допиши в начале спавна
 
Сообщения
956
Реакции
51
Помог
10 раз(а)
SlovePRO, и еще ты не учел это, допустим у игрока есть админка, а ты допустим если время не совпало, то отберешь у него флаг доступа. Надо при конекте игрока отсортировывать игроков с флагом, короче закешировать тех, у кого в дальнейшем будешь отбирать или давать админку
 
Сообщения
174
Реакции
5
Я тут попробовал чуток иначе сделать проверку

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
    new iDay;
    is_weekend(iDay);
   
    if(iDay == 6 || iDay == 7)
    {
        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(&day = 0)
{
    new szTime[3];
    get_time("%u", szTime, charsmax(szTime));
   
    if (!(1 < (day = str_to_num(szTime)) < 7))
        return true;
   
    return false;
}
#endif
Но полюбому есть сомнения что будет работать правильно на выходных
 
Сообщения
956
Реакции
51
Помог
10 раз(а)
SlovePRO, тогда и эту проверку меняй))))
Код:
-iDay == 6 || iDay == 7
+iDay > 5
18 Май 2023
И вообще,
%a сокращенное имя дня недели (Sun)
%A полное название дня недели (воскресенье)
где ты %u нашёл то?
 
Сообщения
956
Реакции
51
Помог
10 раз(а)
точно, тут значит устарело), хотя и так можно проверить субботу и воскресенье
Код:
stock bool:is_weekend() {
    new szDayWeek[2];
    get_time("%A", szDayWeek, 1);

    return szDayWeek[0] == 'S' ? true : false;
}
 
Последнее редактирование:
Сообщения
174
Реакции
5
Code_0xABC, погоди, сток же работает, тут вообще прикол в том чтобы сделать проверку:
Если РЕЖИМ ВЫХОДНЫЕ ДНИ то не работает РЕЖИМ НОЧНОЙ ВИП
 
Сообщения
956
Реакции
51
Помог
10 раз(а)
SlovePRO, и достаточно так, зачем получать через ссылку значение, если сток нам вернет 6 или 7 день
Код:
new iDay;
is_weekend();

if(iDay == 6 || iDay ==7)
/*убрать то что выше*/

if(is_weekend()) {
    //code так как выходной
}

//и
stock bool:is_weekend(/*&day = 0*/)
{
    new szTime[3];
    get_time("%u", szTime, charsmax(szTime));
   
    return str_to_num(szTime) > 5 ? true : false;
}
 
Сообщения
174
Реакции
5
@Code_0xABC,ща попробую
19 Май 2023
@Code_0xABC,работает
19 Май 2023
Но полюбому проверка нужна)
 
Сообщения
956
Реакции
51
Помог
10 раз(а)
SlovePRO, только уже такая
Код:
#if defined WEEKEND_MODE
    if(is_weekend())
    {
        //code
    }
#endif
 

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

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