Вопрос: Как можно сделать проверку на уровень для зомби классов (ZP 5.0.8)

Сообщения
418
Реакции
-7
Лвл система есть, в меню выбора зм класса тоже есть приписка "\r[%d LVL]" но.. как саму проверку на зм классы сделать... Т.е я знаю как делать саму проверку в zp_user_infected_pre(id) но там требуется типо (возвращаем классический зомби класс, если не достаточно уровня, НО сам этот классический зм класс не прописан в плагине того зомби класса, в котором я делаю проверку) что делать?

1682430427242.png
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
нативом
Код:
if(zp_class_zombie_get_current(pId) == 0) //в нашем случай классик наверное
{
    //code
}
p.s. не целесобразно делать в client_prethink🤫
 
Сообщения
418
Реакции
-7
нативом
Код:
if(zp_class_zombie_get_current(pId) == 0) //в нашем случай классик наверное
{
    //code
}
p.s. не целесобразно делать в client_prethink🤫
нет такого (zp_class_zombie_get_current) :(
25 Апр 2023
Может быть инклюд есть какой на это? А, это делает инклюд zp50_class_zombie... сейчас тестану
 
Последнее редактирование:
Сообщения
418
Реакции
-7
C++:
public zp_user_infected_post(id)
{
    if ((zp_class_zombie_get_next(id) == g_zclass_china) && !zp_get_user_nemesis(id))
    {
        if (zp_level(id) >= LVL_COUNT)
        {
        emit_sound(id, CHAN_VOICE, g_china_Infect_Sound[random(sizeof g_china_Infect_Sound)],  VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
        new text[100]
        new note_cooldown = floatround(g_abilonecooldown)
        format(text,99,"^x04[ZP] ^x01Способность^x04 [Разгон] ^x01 | Время:^x04 %d ^x01сек.",note_cooldown)
        message_begin(MSG_ONE,MsgSayText,{0,0,0},id)
        write_byte(id)
        write_string(text)
        message_end()
        
        i_cooldown_time[id] = floatround(g_abilonecooldown)
        remove_task(id)
        g_speeded[id] = 0
        g_abil_one_used[id] = 0
        }
        else
        {
            zp_class_zombie_get_current(id) == 0
            zp_colored_print(id, "^x01[^x04ZP^x01] Вы не достигли ^x04%d ^x01уровня!", LVL_COUNT)
        }
    }
}
25 Апр 2023
C++:
public zp_user_infected_pre(id)
{
    if (zp_get_user_next_class(id) == g_zclass_china)
    {
        if(is_user_alive(id) && zp_get_user_zombie(id) && (zp_get_user_zombie_class(id) == g_zclass_china) && !zp_get_user_nemesis(id))
        {
            if (zp_level(id) < LVL_COUNT)
            {
                zp_class_zombie_get_current(id) == 0
                zp_colored_print(id, "^x01[^x04ZP^x01] Вы не достигли ^x04%d ^x01уровня!", LVL_COUNT)
            }
            else
            {
                zp_set_user_zombie_class(id, g_zclass_china)
                Action(id)
            }
        }
    }
}
public zp_user_infected_post(id)
{
    if ((zp_get_user_zombie_class(id) == g_zclass_china) && !zp_get_user_nemesis(id))
    {
        emit_sound(id, CHAN_VOICE, g_china_Infect_Sound[random(sizeof g_china_Infect_Sound)],  VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
        new text[100]
        new note_cooldown = floatround(g_abilonecooldown)
        format(text,99,"^x04[ZP] ^x01Способность^x04 [Разгон] ^x01 | Время:^x04 %d ^x01сек.",note_cooldown)
        message_begin(MSG_ONE,MsgSayText,{0,0,0},id) 
        write_byte(id) 
        write_string(text) 
        message_end()
        
        i_cooldown_time[id] = floatround(g_abilonecooldown)
        remove_task(id)
        g_speeded[id] = 0
        g_abil_one_used[id] = 0
    }
}
C++:
public Action(id)
{
    if (g_speeded[id] == 1)
    {
        set_user_maxspeed(id , g_fastspeed); 
    }
    else
    {
        set_user_maxspeed(id , g_normspeed); 
    }
        return PLUGIN_HANDLED;
}

Может быть так?
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
оставь только пост, убери пре

Код:
public zp_user_infected_post(id)
{
    if(zp_class_zombie_get_current(id) != g_zclass_china && !zp_get_user_nemesis(id))
        return;
    if(zp_level(id) < LVL_COUNT)
    {
        zp_colored_print(id, "^x01[^x04ZP^x01] Вы не достигли ^x04%d ^x01уровня!", LVL_COUNT);
        return;
    }
    emit_sound(id, CHAN_VOICE, g_china_Infect_Sound[random(sizeof g_china_Infect_Sound)],  VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
    new note_cooldown = floatround(g_abilonecooldown)
    
    zp_colored_print(id, "^x04[ZP] ^x01Способность^x04 [Разгон] ^x01 | Время:^x04 %d ^x01сек.", note_cooldown);

    i_cooldown_time[id] = floatround(g_abilonecooldown)
    remove_task(id)
    g_speeded[id] = 0
    g_abil_one_used[id] = 0
    
    Action(id)
 
}
 
Сообщения
418
Реакции
-7
оставь только пост, убери пре

Код:
public zp_user_infected_post(id)
{
    if(zp_class_zombie_get_current(id) != g_zclass_china && !zp_get_user_nemesis(id))
        return;
    if(zp_level(id) < LVL_COUNT)
    {
        zp_colored_print(id, "^x01[^x04ZP^x01] Вы не достигли ^x04%d ^x01уровня!", LVL_COUNT);
        return;
    }
    emit_sound(id, CHAN_VOICE, g_china_Infect_Sound[random(sizeof g_china_Infect_Sound)],  VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
    new text[100]
    new note_cooldown = floatround(g_abilonecooldown)
    format(text,99,"^x04[ZP] ^x01Способность^x04 [Разгон] ^x01 | Время:^x04 %d ^x01сек.",note_cooldown)
    message_begin(MSG_ONE,MsgSayText,{0,0,0},id)
    write_byte(id)
    write_string(text)
    message_end()
   
    i_cooldown_time[id] = floatround(g_abilonecooldown)
    remove_task(id)
    g_speeded[id] = 0
    g_abil_one_used[id] = 0
   
    Action(id)

}
А client_prethink?
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
Сообщения
418
Реакции
-7
RedGamer, а что сним? ты вкурсе что client_prethink вызывает ровно столько сколько у игрока фпс? если у него 100 фпс в секунду, то вызывается 100 раз в секунду


client_PostThink и client_PreThink Функции вызываются каждый кадр игрока » AmxModX Скриптинг для новичков в примерах (amxxmodx.ru)
ну это понятно, кстати не работает твой вариант почему-то..
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
RedGamer, все условия выполнены? игрок Китаец? он не немезида? имеет достаточно опыта?

для наверника задебаж каждую условию (etc log_amx(), server_print)
 
Сообщения
418
Реакции
-7
RedGamer, все условия выполнены? игрок Китаец? он не немезида? имеет достаточно опыта?

для наверника задебаж каждую условию (etc log_amx(), server_print)
Игрок китаец, он не немезида, НЕ имеет достаточно опыта
25 Апр 2023
Т.е ставится Китаец хотя уровень не позволяет
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
ааа, попробуй вот так
вместо
Код:
if(zp_class_zombie_get_current(id) != g_zclass_china && !zp_get_user_nemesis(id))
        return;
поменять на:
Код:
if(zp_class_zombie_get_current(id) != g_zclass_china && zp_get_user_nemesis(id))
        return;
я бы вообще убрал бы проверку zp_get_user_nemesis(id), т.к. фактический нельзя заразиться и стать немезидой
 
Сообщения
418
Реакции
-7
ааа, попробуй вот так
вместо
Код:
if(zp_class_zombie_get_current(id) != g_zclass_china && !zp_get_user_nemesis(id))
        return;
поменять на:
Код:
if(zp_class_zombie_get_current(id) != g_zclass_china && zp_get_user_nemesis(id))
        return;
я бы вообще убрал бы проверку zp_get_user_nemesis(id), т.к. фактический нельзя заразиться и стать немезидой
Не помогло, ну если так кратко сказать, то выдаётся зм класс Китаец и пишет в чат нету %d уровня (но сам класс не переключился на классика)
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
RedGamer, я не совсем понял чего ты хочешь)

То что я понял, если игрок китаец и имеет достаточно лвл то выдает скорость если она включена иначе скорость выставляется как обычно
 
Сообщения
418
Реакции
-7
Да и способность Action(id) пропала вообще
25 Апр 2023
RedGamer, я не совсем понял чего ты хочешь)

То что я понял, если игрок китаец и имеет достаточно лвл то выдает скорость если она включена иначе скорость выставляется как обычно
Если игрок не имеет достаточно лвла то меняется на классический зомби класс (при этом скорость оставить только у Китайца)
25 Апр 2023
Как вернуть классический зомби класс, если недостаточно лвла?
 
Сообщения
192
Реакции
148
Помог
1 раз(а)
RedGamer, zp_fw_core_cure + zp_class_zombie_set_next попробуй.
А вообще, посмотри в исходниках мода где выставляется зм класс

в zp_fw_core_infect_post -> g_ZombieClass[id] = g_ZombieClassNext[id]
 
Сообщения
893
Реакции
149
Помог
25 раз(а)
У тебя есть в ZP 5.0.8 форвард:
C++:
/**
 * Called when a player gets infected.
 *
 * @param id        Player index who was infected.
 * @param attacker    Player who triggered the infection.
 *                    (0 if not available, id = attacker if he infected himself)
 */
forward zp_fw_core_infect(id, attacker)
forward zp_fw_core_infect_post(id, attacker)
Вызывается он в момент, когда человека заразили. Ты можешь сделать, как в старом добром 4.3 делали.
C++:
public zp_fw_core_infect(id)
{
    if(zp_class_zombie_get_current(id) == g_zclass_china)
    {
        if(zp_level(id) < LVL_COUNT)
        {
            zp_colored_print(id, "^x01[^x04ZP^x01] Вы не достигли ^x04%d ^x01уровня!", LVL_COUNT)
            zp_class_zombie_set_next(id, 0)
        }
    }
}
Это как 1 из вариантов.
25 Апр 2023
Либо использовать форвард, когда игрок выбрал зомби в меню.
C++:
/**
 * Called when determining whether a class should be available to a player.
 *
 * Possible return values are:
 *    - ZP_CLASS_AVAILABLE (show in menu, allow selection)
 *    - ZP_CLASS_NOT_AVAILABLE (show in menu, don't allow selection)
 *    - ZP_CLASS_DONT_SHOW (don't show in menu, don't allow selection)
 *
 * @param id            Player index.
 * @param classid        Internal zombie class ID.
 */
forward zp_fw_class_zombie_select_pre(id, classid)
 
Сообщения
1,055
Реакции
212
Предупреждения
9
Помог
6 раз(а)
Продолжаем собирать всем форумом зомби сервер
 

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

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