Таск + health.

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
857
Реакции
144
Помог
25 раз(а)
Здравствуйте, есть у меня такой код: После получения урона через n кол-во секунд начинает идти "регенерация", с выставленной "частотой" работы таска.
По факту должно работать так:
Я получаю урон, через 5 секунд секунд таск должен проводится каждых 4 секунды (всё работаем по кварах) (Код ниже)

C++:
/*
    changelog:
        - v1.0 - Релиз.
        - v1.1:
            - Добавлен квар "zp43_zclass_regen_nemesis" (Регенерация для немезиды);
            - Поправлен и переработан квар "zp43_zclass_regen_duration" (Возможность бесконечной регенерации);
        - v1.2:
            - Попавлен квар "zp43_zclass_regen_nemesis" - (Выставляло хп зомби класса);
            - Теперь, после того, как игрок стал человеком или вышел - регенерация убирается (Ранее этого не было предусмотренно);

    gratitude:
        b0t. - За помощь в реализации.
*/

#include <AmxModX>
#include <ZombiePlague>
#tryinclude <ReApi> //закомментируйте если не используйте ReAPI

#if !defined _reapi_included
    #include <HamSandWich>
    #include <FakeMeta>
#endif

new const szPlInf[][] = {
    "[ZP 4.3] ZClass: Regeneration",
    "1.1",
    "ImmortalAmxx"
};

new const ZclassInfo[][] = {
    "Genius",
    "Regeneration",
    "zombie_source",
    "v_knife_zombie.mdl",
    "10000",
    "320",
    "1.0",
    "1.0"
};

enum {
    TASKID_REGEN_START = 4444,
    TASKID_REGEN = 777
};

enum _:Cvars {
    DURATION,
    Float:INTERVAL,
    Float:HEALTH_COUNT,
    Float:START_TIME,
    NEMESIS
};

new g_pCvars[Cvars], g_iClassID;

public plugin_init() {
    register_plugin(
        .plugin_name = szPlInf[0],
        .version = szPlInf[1],
        .author = szPlInf[2]
    );

    UTIL_Hook();
    UTIL_Cvars();
}

public client_disconnected(pPlayer)
    RemoveRegeneration(pPlayer);

public plugin_precache() {
    g_iClassID = zp_register_zombie_class(
        .name = ZclassInfo[0],
        .info = ZclassInfo[1],
        .model = ZclassInfo[2],
        .clawmodel = ZclassInfo[3],
        .hp = str_to_num(ZclassInfo[4]),
        .speed = str_to_num(ZclassInfo[5]),
        .gravity = str_to_float(ZclassInfo[6]),
        .knockback = str_to_float(ZclassInfo[7])
    );
}

public UTIL_Hook() {
    #if defined _reapi_included
        RegisterHookChain(RG_CBasePlayer_TakeDamage, "CBase_Player_TakeDamage_Post", .post = true);
    #else
        RegisterHam(Ham_TakeDamage, "player", "CBase_Player_TakeDamage_Post", .Post = true);
    #endif
}

public UTIL_Cvars() {
    bind_pcvar_num(create_cvar(
        .name = "zp43_zclass_regen_duration",
        .string = "5",
        .description = "Время регенерации. 0 - Бесконечно",
        .has_min = true,
        .min_val = 0.0
    ), g_pCvars[DURATION]);

    bind_pcvar_float(create_cvar(
        .name = "zp43_zclass_regen_interval",
        .string = "4.0",
        .description = "Интервал регенирации.",
        .has_min = true,
        .min_val = 1.0
    ), g_pCvars[INTERVAL]);   

    bind_pcvar_float(create_cvar(
        .name = "zp43_zclass_regen_health_count",
        .string = "5.0",
        .description = "По сколько ХП регенерировать?",
        .has_min = true,
        .min_val = 1.0
    ), g_pCvars[HEALTH_COUNT]);

    bind_pcvar_float(create_cvar(
        .name = "zp43_zclass_regen_after_damage",
        .string = "5.0",
        .description = "Через сколько секунд после последнего полученного урона начать регенерировать хп?",
        .has_min = true,
        .min_val = 1.0
    ), g_pCvars[START_TIME]);
    
    bind_pcvar_num(create_cvar(
        .name = "zp43_zclass_regen_nemesis",
        .string = "1",
        .description = "Давать регенерацию немезиде? 0 - Нет, 1 - Да.",
        .has_min = true,
        .min_val = 0.0,
        .has_max = true,
        .max_val = 1.0
    ), g_pCvars[NEMESIS]);   

    AutoExecConfig(.autoCreate = true, .name = "ZpClassRegenerationNew", .folder = "ImmortalAmxx");
}

public CBase_Player_TakeDamage_Post(pPlayer) {
    if(
        !is_user_connected(pPlayer) ||
        !zp_get_user_zombie(pPlayer) ||
        zp_get_user_zombie_class(pPlayer) != g_iClassID
    )
        return;
        
    if(!g_pCvars[NEMESIS]) {
        if(zp_get_user_nemesis(pPlayer))
            return;
    }

    RemoveRegeneration(pPlayer);
        
    set_task(g_pCvars[START_TIME], "CTask_RegenStart", pPlayer + TASKID_REGEN_START);
}

public CTask_RegenStart(pPlayer) {
    pPlayer -= TASKID_REGEN_START;

    if(!is_user_connected(pPlayer))
        return;
    
    if(!g_pCvars[DURATION])
        set_task(g_pCvars[INTERVAL], "CTask_Regeneration", pPlayer + TASKID_REGEN, .flags = "b");
    else
        set_task(g_pCvars[INTERVAL], "CTask_Regeneration", pPlayer + TASKID_REGEN, .flags = "b", .repeat = g_pCvars[DURATION]);
}

public CTask_Regeneration(pPlayer) {
    pPlayer -= TASKID_REGEN;

    new pCvar = get_cvar_num("zp_nem_health");

    if(!is_user_connected(pPlayer))
        return;

    if(!is_user_alive(pPlayer))
        RemoveRegeneration(pPlayer);

    client_print(pPlayer, print_chat, "%f", g_pCvars[INTERVAL]);

    #if defined _reapi_included
        if(Float:get_entvar(pPlayer, var_health) >= float(zp_get_zombie_maxhealth(pPlayer))) {
            set_entvar(pPlayer, var_health, float(zp_get_zombie_maxhealth(pPlayer)));

            client_print_color(pPlayer, print_team_default, "^1[^4Класс^1] Отключаю ^4реген^1, достигнуто ^4максимальное ^1количество ^4ХП^1.");
            RemoveRegeneration(pPlayer);           
        }
        else
            set_entvar(pPlayer, var_health, Float:get_entvar(pPlayer, var_health) + g_pCvars[HEALTH_COUNT]);
    #else
        if(pev(pPlayer, pev_health) >= zp_get_user_nemesis(pPlayer) ? float(pCvar) : float(zp_get_zombie_maxhealth(pPlayer))) {
            client_print_color(pPlayer, print_team_default, "^1[^4Класс^1] Отключаю ^4реген^1, достигнуто ^4максимальное ^1количество ^4ХП^1.");
            RemoveRegeneration(pPlayer);
        }

        new Float:fHp = floatclamp((pev(pPlayer,pev_health) + g_pCvars[HEALTH_COUNT]), 1.0, zp_get_user_nemesis(pPlayer) ? float(pCvar) : float(zp_get_zombie_maxhealth(pPlayer)));
        set_pev(pPlayer, pev_health, fHp);
    #endif
}

public zp_user_humanized_post(pPlayer)
    RemoveRegeneration(pPlayer);

public RemoveRegeneration(pPlayer) {
    remove_task(pPlayer + TASKID_REGEN);
    remove_task(pPlayer + TASKID_REGEN_START);   
}
Только проблема вот в чем.
Жизни восстанавливает каждую секунду, а не каждых 4 секунды.
Что я делаю не так?
 
Сообщения
775
Реакции
291
Помог
11 раз(а)
Сори, с телефона.
Но мне кажется или флаг "b" выполняется бесконечное количество раз. Если тебе нужно через время, вроде как флаг "а"
set_task(g_pCvars[INTERVAL], "CTask_Regeneration", pPlayer + TASKID_REGEN, .flags = "b", .repeat = g_pCvars[DURATION]);
 
Сообщения
857
Реакции
144
Помог
25 раз(а)
maFFyoZZyk, изначально стоял флаг "a", была проблема такая же, попробовал поменять на флаг "b" - проблема осталась.
 

Garey

ninjaCow
Сообщения
411
Реакции
1,051
Помог
10 раз(а)
Проверь конфиг плагина мб там 1.
 
Сообщения
857
Реакции
144
Помог
25 раз(а)
maFFyoZZyk, не помогло.
Garey, там 4.0 значение.

Заметил, что изначально таск выполняется каждую секунду, и после того, как он 5 раз выполнился, интервал уже становится 4.
Так же попытался вывести число квара:
C++:
client_print(pPlayer, print_chat, "%f", g_pCvars[INTERVAL]);
И оно выводит так-же после того, как таск исполнился 5 раз.
2 Июл 2022
Похоже дело в repeat.
Если я выставлю значение 3 к примеру, тогда интервал начинает работать через 3 выполнения таска, если 5 - то через 5.
Вот строчка:
C++:
set_task(g_pCvars[INTERVAL], "CTask_Regeneration", pPlayer + TASKID_REGEN, .flags = "a", .repeat = g_pCvars[DURATION]);
Может знает кто, в чем дело?
 
Сообщения
775
Реакции
291
Помог
11 раз(а)
Benzogang_BabyTape, 63 и 64 строка, поменяй местами. Ты должен сначала квары считать, а только потом выполнять работу плагина
 
Сообщения
494
Реакции
340
Помог
11 раз(а)
Benzogang_BabyTape, 63 и 64 строка, поменяй местами. Ты должен сначала квары считать, а только потом выполнять работу плагина
Квары считаются быстрее, чем выполнится хук получения урона. Тут все ок.

Похоже дело в repeat.
Если я выставлю значение 3 к примеру, тогда интервал начинает работать через 3 выполнения таска, если 5 - то через 5.
Вот строчка:
C++:
set_task(g_pCvars[INTERVAL], "CTask_Regeneration", pPlayer + TASKID_REGEN, .flags = "a", .repeat = g_pCvars[DURATION]);
Может знает кто, в чем дело?
.repeat значение влияет всего лишь на то, сколько раз будет выполнено повторение функции set_task, период остаётся все тот же, который ты задаёшь 1-ым параметром.
По коду вроде все окей, введи amxx cvar, пересмотри все же свои значения кваров.
 
Сообщения
494
Реакции
340
Помог
11 раз(а)
Benzogang_BabyTape, попробуй такой вариант.
Для немезиса проверку и под свой класс сам только подстраивай. Сейчас для всех зомби. Проверил, всё окей работает.
 

Вложения

Сообщения
857
Реакции
144
Помог
25 раз(а)
bizon, у тебя задержка выполнения таска работала? У меня нет, возможно у меня что-то не так с модулями?
 
Сообщения
494
Реакции
340
Помог
11 раз(а)
Benzogang_BabyTape, всё и всегда работало вне зависимости от модулей. Для теста можешь попробовать сделать think + get_gametime().
 
Статус
В этой теме нельзя размещать новые ответы.

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

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