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

Сообщения
956
Реакции
51
Помог
10 раз(а)
SlovePRO, кстате для удобности твоей)
Код:
#define VIP_TIME(%0,%1) (0 <= iTime <= %1 || %0 <= iTime <= 24)

stock bool:UTIL_IsNightMode() {
    new szTime[4];
    get_time("%H", szTime, charsmax(szTime));

    new iTime = str_to_num(szTime);

    return bool:(VIP_TIME(18, 6));
}
 

Albertio

скриптизёр
Сообщения
336
Реакции
393
Предупреждения
5
Помог
7 раз(а)
SlovePRO, ну, хз хз, опять лезть в код. Можно уже тогда просто вывести два дефайна с этими промежутками.
Но я бы все эти приколы вывел в конфиг и квары. ИМХО.
Завтра время будет - допилю
 

Albertio

скриптизёр
Сообщения
336
Реакции
393
Предупреждения
5
Помог
7 раз(а)
Забыл совсем дропнуть сюда

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

enum CVARS {
    WEEKEND_MODE[32],
    NIGHT_MODE[32],
    GIVE_FLAG[4],
    HAVE_FLAG[4]
};

new g_eCvars[CVARS];

enum FlagsVIP {
    GIVE,
    HAVE
};

new g_eFlagsVIP[FlagsVIP];

new g_szSelectedMode[32];

public plugin_init() {
    register_plugin("Night & Weekend VIP", "0.0.1", "Albertio");
    
    RegisterHam(Ham_Spawn, "player", "PlayerSpawn_Post", true);

    RegisterCvars();
    AutoExecConfig(true, "night_weekend_vip");

    if(g_eCvars[WEEKEND_MODE][0] != EOS)
        if(UTIL_IsWeekendMode())
            copy(g_szSelectedMode, charsmax(g_szSelectedMode), g_eCvars[WEEKEND_MODE]);

    if(g_eCvars[NIGHT_MODE][0] != EOS && g_szSelectedMode[0] == EOS)
        if(UTIL_IsNightMode())
            copy(g_szSelectedMode, charsmax(g_szSelectedMode), g_eCvars[NIGHT_MODE]);

    g_eFlagsVIP[GIVE] = read_flags(g_eCvars[GIVE_FLAG]);
    g_eFlagsVIP[HAVE] = read_flags(g_eCvars[HAVE_FLAG]);
}

public client_putinserver(id) {
    if(is_user_bot(id) || is_user_hltv(id))
        return;

    if(equali(g_szSelectedMode, g_eCvars[WEEKEND_MODE]))
        UTIL_IssueVIP(id);
    else if(equali(g_szSelectedMode, g_eCvars[NIGHT_MODE]))
        UTIL_IssueVIP(id);
}

public PlayerSpawn_Post(id) {
    if(g_szSelectedMode[0] != EOS && ~get_user_flags(id) & g_eFlagsVIP[HAVE] && is_user_alive(id)) {
        client_cmd(id, "vipmenu");
        client_print_color(id, print_team_default, "^1Вам выдана бесплатная^4 VIP,^1 причина:^4 %s^1.", g_szSelectedMode);
    }
}

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

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 UTIL_IssueVIP(const iPlayer) {
    if(~get_user_flags(iPlayer) & g_eFlagsVIP[HAVE]) {
        remove_user_flags(iPlayer, ADMIN_USER);
        set_user_flags(iPlayer, g_eFlagsVIP[GIVE]);
    }
}

public RegisterCvars() {
    bind_pcvar_string(create_cvar(
        "nwv_weekend_mode",
        "Выходные дни",
        FCVAR_NONE,
        "Режим выходной випки. Что бы выключить, оставьте поле пустым."),
        g_eCvars[WEEKEND_MODE],
        charsmax(g_eCvars[WEEKEND_MODE])
    );
    bind_pcvar_string(create_cvar(
        "nwv_night_mode",
        "Ночной режим",
        FCVAR_NONE,
        "Режим ночной випки. Что бы выключить, оставьте поле пустым."),
        g_eCvars[NIGHT_MODE],
        charsmax(g_eCvars[NIGHT_MODE])
    );
    bind_pcvar_string(create_cvar(
        "nwv_give_flag",
        "t",
        FCVAR_NONE,
        "Флаг, который выдается VIP'у"),
        g_eCvars[GIVE_FLAG],
        charsmax(g_eCvars[GIVE_FLAG])
    );
    bind_pcvar_string(create_cvar(
        "nwv_have_flag",
        "u",
        FCVAR_NONE,
        "При наличии этого флага, не выдается VIP"),
        g_eCvars[HAVE_FLAG],
        charsmax(g_eCvars[HAVE_FLAG])
    );
}
 
Сообщения
174
Реакции
5
Albertio, код рабочий, только есть нюанс, чтобы правильно работали режимы, нужно сменить карту или перезапустить сервер.

Допустим, настройка стоит return bool:(0 <= iTime <= 6 || 18 <= iTime <= 24);, а время уже больше 18:30, и получается что привилегия не выдается.
- Как только смену карты сделал, то всё работает.

Может есть идеи как решить?
 
Сообщения
956
Реакции
51
Помог
10 раз(а)
SlovePRO, потому что функция выполняется тут public plugin_init() , к чему это, к тому, что проверка делается в начале карты и все
 
Последнее редактирование:
Сообщения
174
Реакции
5
Code_0xABC, а разве не тут?

C++:
public client_putinserver(id) {
    if(is_user_bot(id) || is_user_hltv(id))
        return;

    if(equali(g_szSelectedMode, g_eCvars[WEEKEND_MODE]))
        UTIL_IssueVIP(id);
    else if(equali(g_szSelectedMode, g_eCvars[NIGHT_MODE]))
        UTIL_IssueVIP(id);
}
Или я что-то не понимаю!
 
Сообщения
956
Реакции
51
Помог
10 раз(а)
В plugin_init делается проверка и кешируется выходной или ночное время, а в putunserver уже проверяется записанный массив if(equali(g_szSelectedMode, g_eCvars[NIGHT_MODE]))
 
Сообщения
313
Реакции
21
Предупреждения
19
Помог
7 раз(а)
SlovePRO, проверку сделай по окончанию раунда… 💁‍♂️
 
Сообщения
174
Реакции
5
Code_0xABC, а что если так:

C++:
public client_putinserver(id) {
    if(is_user_bot(id) || is_user_hltv(id))
        return;

    if(g_eCvars[WEEKEND_MODE][0] != EOS)
        if(UTIL_IsWeekendMode())
            copy(g_szSelectedMode, charsmax(g_szSelectedMode), g_eCvars[WEEKEND_MODE]);

    if(g_eCvars[NIGHT_MODE][0] != EOS && g_szSelectedMode[0] == EOS)
        if(UTIL_IsNightMode())
            copy(g_szSelectedMode, charsmax(g_szSelectedMode), g_eCvars[NIGHT_MODE]);

    if(equali(g_szSelectedMode, g_eCvars[WEEKEND_MODE]))
        UTIL_IssueVIP(id);
    else if(equali(g_szSelectedMode, g_eCvars[NIGHT_MODE]))
        UTIL_IssueVIP(id);
}
Ну или лучше в функции спавна игрока?
 
Сообщения
956
Реакции
51
Помог
10 раз(а)
SlovePRO, в путине плохо, практически погоды не поменяет, кешировать массив g_szSelectedMode нужно именнопри старте раунда, а в спавне игрока проверять, к примеру
 
Сообщения
174
Реакции
5
Code_0xABC, типа так?

C++:
public client_putinserver(id) {
    if(is_user_bot(id) || is_user_hltv(id))
        return;

    if(equali(g_szSelectedMode, g_eCvars[WEEKEND_MODE]))
        UTIL_IssueVIP(id);
    else if(equali(g_szSelectedMode, g_eCvars[NIGHT_MODE]))
        UTIL_IssueVIP(id);
}

@CSGameRules_CleanUpMap_Post() {
    if(g_eCvars[WEEKEND_MODE][0] != EOS)
        if(UTIL_IsWeekendMode())
            copy(g_szSelectedMode, charsmax(g_szSelectedMode), g_eCvars[WEEKEND_MODE]);

    if(g_eCvars[NIGHT_MODE][0] != EOS && g_szSelectedMode[0] == EOS)
        if(UTIL_IsNightMode())
            copy(g_szSelectedMode, charsmax(g_szSelectedMode), g_eCvars[NIGHT_MODE]);
}

public PlayerSpawn_Post(id) {
    if(equali(g_szSelectedMode, g_eCvars[WEEKEND_MODE]))
        UTIL_IssueVIP(id);
    else if(equali(g_szSelectedMode, g_eCvars[NIGHT_MODE]))
        UTIL_IssueVIP(id);
    
    if(g_szSelectedMode[0] != EOS && ~get_user_flags(id) & g_eFlagsVIP[HAVE] && is_user_alive(id)) {
        client_cmd(id, "vipmenu");
        client_print_color(id, print_team_default, "^1Вам выдана бесплатная^4 VIP,^1 причина:^4 %s^1.", g_szSelectedMode);
    }
}
 
Сообщения
174
Реакции
5
Code_0xABC, ну ладно:
register_event("HLTV", "OnRoundStart", "a", "1=0", "2=0")
C++:
public OnRoundStart() {
    if(g_eCvars[WEEKEND_MODE][0] != EOS)
        if(UTIL_IsWeekendMode())
            copy(g_szSelectedMode, charsmax(g_szSelectedMode), g_eCvars[WEEKEND_MODE]);

    if(g_eCvars[NIGHT_MODE][0] != EOS && g_szSelectedMode[0] == EOS)
        if(UTIL_IsNightMode())
            copy(g_szSelectedMode, charsmax(g_szSelectedMode), g_eCvars[NIGHT_MODE]);
}
 
Сообщения
956
Реакции
51
Помог
10 раз(а)
Покажи полностью, а не одну функцию
 
Сообщения
174
Реакции
5
Code_0xABC,
C++:
public plugin_init() {
    register_plugin("Bonus NW", "0.0.1", "Albertio");
    
    register_event("HLTV", "OnRoundStart", "a", "1=0", "2=0");
    RegisterHam(Ham_Spawn, "player", "PlayerSpawn_Post", true);

    RegisterCvars();
    AutoExecConfig(true, "plugin-bonus_nw");
        
    g_eFlagsVIP[GIVE] = read_flags(g_eCvars[GIVE_FLAG]);
    g_eFlagsVIP[HAVE] = read_flags(g_eCvars[HAVE_FLAG]);
}

public client_putinserver(id) {
    if(is_user_bot(id) || is_user_hltv(id))
        return;

    if(equali(g_szSelectedMode, g_eCvars[WEEKEND_MODE]))
        UTIL_IssueVIP(id);
    else if(equali(g_szSelectedMode, g_eCvars[NIGHT_MODE]))
        UTIL_IssueVIP(id);
}

public OnRoundStart() {
    if(g_eCvars[WEEKEND_MODE][0] != EOS)
        if(UTIL_IsWeekendMode())
            copy(g_szSelectedMode, charsmax(g_szSelectedMode), g_eCvars[WEEKEND_MODE]);

    if(g_eCvars[NIGHT_MODE][0] != EOS && g_szSelectedMode[0] == EOS)
        if(UTIL_IsNightMode())
            copy(g_szSelectedMode, charsmax(g_szSelectedMode), g_eCvars[NIGHT_MODE]);
}

public PlayerSpawn_Post(id) {
    if(equali(g_szSelectedMode, g_eCvars[WEEKEND_MODE]))
        UTIL_IssueVIP(id);
    else if(equali(g_szSelectedMode, g_eCvars[NIGHT_MODE]))
        UTIL_IssueVIP(id);
    
    if(g_szSelectedMode[0] != EOS && ~get_user_flags(id) & g_eFlagsVIP[HAVE] && is_user_alive(id)) {
        client_print_color(id, print_team_default, "^1Вам выдана бесплатная^4 VIP,^1 причина:^4 %s^1.", g_szSelectedMode);
    }
}
 

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

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