Иконка ресурса

Regen HP AP for knife 1.1

Нет прав для скачивания
Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
1) Конфигурацию лучше в квары, есть bind_pcvar_*.
2) Зачем создавать переменные в PostThink если используется в итоге только если есть нож? Поэтому лучше проверять есть ли нож и если нет то не идти дальше по коду.
3) Форматирование кода желает оставлять лучшего. Определитесь, использовать венгерскую нотацию или нет:
Код:
@CBasePlayer_PostThink_Post(const Player)
Тут не используется, однако например тут используется:
Код:
new Float: flHealth = Float: get_entvar(Player, var_health)
new Float: flAmmor = Float: get_entvar(Player, var_armorvalue)
Тут ещё недочёт с flAmmor, правильно будет flArmor.

Собственно, где-то используется, где-то нет:
Код:
new Float: set_gametime = get_gametime()
new wID = get_user_weapon(Player)
Забавный момент:
Код:
static Float: iHealth[MAX_CLIENTS + 1]
Собственно, это Float но название iHealth (i - integer). Но то что больше удивляет это то что название вообще не имеет ничего общего с тем какой функционал выполняет.

4) Очень сомневаюсь что для RG_CBasePlayer_PostThink нужно указывать в параметре post = true ибо сам хук и так post.
 
Сообщения
1,277
Реакции
2,259
Помог
57 раз(а)
Зачем синк, чего вхолостую код гонять? Может лучше глобальный таймер(таск) тикающий раз в # (в данном случае, 5) секунд, либо тикающий раз в секунду (аккуратнее), и проверяющий всё то же время последнего регена?
 
Сообщения
500
Реакции
110
Помог
16 раз(а)
Задумка прикольная,но я думаю это больше подойдет для VIP можно настройку добавить?
 
Сообщения
2,491
Реакции
2,795
Помог
61 раз(а)
BlackSignature, w0w, я бы зарегал хук через
Код:
RegisterHam(Ham_Think, "weapon_knife", "", true)
И крутил через nextthink интервал.
К сожалению SetThink нельзя так просто использовать. Он используется только ради декалей и то раз. Придется дополнительно хукать атаку.
Поэтому вариант проще с Ham_Think. И тогда куча кода может быть удалена (я про проверки времени в think).
 
Сообщения
1,697
Реакции
1,510
Помог
25 раз(а)
4) Очень сомневаюсь что для RG_CBasePlayer_PostThink нужно указывать в параметре post = true ибо сам хук и так post.
Ты путаешь хук и очередность вызова функций. ПостСинк точно такая же функция, которая имеет пре и пост хук.
 

d3m37r4

111111
Сообщения
1,449
Реакции
1,175
Помог
10 раз(а)
Мб тут ham deploy и holster заюзать?
 
Сообщения
1,697
Реакции
1,510
Помог
25 раз(а)
Можно создать триггер_хурт и блочить урон если не с ножом, можно обычной энтити, с некстсинком, раз так не хочется использовать синк игрока.
 
Сообщения
33
Реакции
15
Помог
1 раз(а)
Задумка прикольная,но я думаю это больше подойдет для VIP можно настройку добавить?
Добавим.
27 Фев 2019
fantom, а интервал как отловить? Единственное что хорошее в этом хуке - это то что хук сразу проверяет наличие оружие и только при этом начинает свое выполнение. Как бы это не плохо... Если будут еще рекомендации добавлю поддержу еще на Ham

BlackSignature, set_task как по мне не лучшая идея - дополнительные хуки и переменные и события
 
Последнее редактирование:
Сообщения
75
Реакции
82
Помог
6 раз(а)
Куда практичнее, и ни каких синков игрока \ таксков и прочего[HIDE]
Код:
#include <amxmodx>
#include <reapi>
#include <hamsandwich>

#define REGEN_TIME        5.0        // Interval time
#define REGEN_AMOUNT_HP    15.0    // Amount HP for interval
#define REGEN_AMOUNT_AP    15.0    // Amount AP for interval

#define MAX_HP    100.0    // max hp
#define MAX_AP    100.0        // max ap

public plugin_init()    {
    RegisterHam(Ham_Item_PostFrame, "weapon_knife", "Ham_KnifePostFrame", false);
}

public Ham_KnifePostFrame(iItem)
{
    new pPlayer;
    if(!(pPlayer = get_member(iItem, m_pPlayer)) || !is_user_connected(pPlayer))
        return HAM_IGNORED;
 
    new Float:fGametime;    fGametime = get_gametime();
 
    if(get_member(iItem, m_Weapon_fInSpecialReload) < fGametime)    {
 
        set_entvar(pPlayer, var_health, floatmin(Float:get_entvar(pPlayer, var_health) + REGEN_AMOUNT_HP, MAX_HP));
        set_entvar(pPlayer, var_armorvalue, floatmin(Float:get_entvar(pPlayer, var_armorvalue) + REGEN_AMOUNT_AP, MAX_AP));
     
        set_member(iItem, m_Weapon_fInSpecialReload, fGametime + REGEN_TIME);
    }
 
    return HAM_IGNORED;
}
[/HIDE]
 
Сообщения
2,491
Реакции
2,795
Помог
61 раз(а)
это я понял, но переменная Float все равно для этого нужна.
какая переменная?
А вообше то wopox1337 подсказал наилучшый вариант. Вопрос только как интервал и количество хп регулировать. Лень разбиратся на самом деле. Но думаю там есть такая возможность
 
Сообщения
1,697
Реакции
1,510
Помог
25 раз(а)
Flymic24, постфрейм и есть синк, ещё и пре. Единственное, что отличает от ТС, то что только для ножа. Зачем проверять коннект игрока?
27 Фев 2019
d3m37r4, надо ещё нож менять чтоб получить реген?
 
Сообщения
33
Реакции
15
Помог
1 раз(а)
Куда практичнее, и ни каких синков игрока \ таксков и прочего[Hidden Content]
Вариант не плох но больше кода опять же доп проверок на оружие, но правильно сказал fl0wer, ничем не отличается кроме хука.

Пожалуй оставлю так как есть, обновлю только добавив флаг для VIP

Квары ради этого маленького куска кода добавлять не буду. Спасибо за рекомендации.
 
Сообщения
33
Реакции
15
Помог
1 раз(а)
когда сделаешь это?

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

#define REGEN_TIME            5                    // Interval time
#define REGEN_AMOUNT_HP        15                    // Amount HP for interval
#define REGEN_AMOUNT_AP        15                  // Amount AP for interval

#define MAX_HP    100        // max hp
#define MAX_AP    100        // max ap

public plugin_init()
{
    register_plugin("Regen HP AP for knife", "1.0", "I Am LeGenD")
    
    RegisterHookChain(RG_CBasePlayer_PostThink, "@CBasePlayer_PostThink")
}

@CBasePlayer_PostThink(const Player)
{
    new Float: flTime = get_gametime()
    new Float: flHealth = Float: get_entvar(Player, var_health)
    new Float: flAmmor = Float: get_entvar(Player, var_armorvalue)
    
    static Float: flLife[MAX_CLIENTS + 1]
    
    if(get_user_flags(Player) & ADMIN_LEVEL_H)
    {
        if(get_user_weapon(Player) == CSW_KNIFE)
        {
            if(flLife[Player] < flTime)
            {
                flLife[Player] = flTime + REGEN_TIME.0
            
                if(flHealth < MAX_HP.0 || flAmmor < MAX_AP.0)
                {
                    set_entvar(Player, var_health, floatmin (flHealth + REGEN_AMOUNT_HP.0, MAX_HP.0))
                    set_entvar(Player, var_armorvalue, floatmin (flAmmor + REGEN_AMOUNT_AP.0, MAX_AP.0))
                }
            }
        }
    }
}
 
Сообщения
12
Реакции
2
LeGenD, благодарю
5 Апр 2019
Если выставлять настройки
#define MAX_HP 110 // max hp
#define MAX_AP 110 // max ap
то при респавне у тебя сразу 110 HP/AP, можно ли это фиксануть? Чтобы при респавне было по 100 HP/AP
Точнее, чтобы регенерация была от определенного времени, например 30 сек от начала раунда или от определенного кол-ва HP. Идеально было бы
5 Апр 2019
Игрокам затея понравилась, говорят, что нужна регенерация от определенного кол-ва HP, допустим если HP 80-100, то регенерация не работает, если HP меньше 80, то восстановление идет.
LeGenD, реализуешь такую мысль?
Так же вопрос, почему реген идет с первым армором, а не со вторым?
 
Последнее редактирование:

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

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