Дублируются сообщения

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
702
Реакции
54
Доброй ночи.

Не понимаю принципа работы вывода сообщения. По какой-то причине выводится одновременно штук 20 одинакового текста.
Код:
public CBasePlayer_PreThink_Pre(const id)
{
    if(!is_user_alive(id))
        return HC_CONTINUE;

    if(bm_get_player_class(id) != class_id)
        return HC_CONTINUE;

    if(get_entvar(id, var_button) & IN_USE)
    {
        if(arson_num[id] >= MAX_ARSONS)
        {
            client_print_color(id, print_team_default, "^1[^4Battle Mod^1] У вас больше нет зарядов поджога!");
            return HC_SUPERCEDE;
        }
       
        static Float:game_time, Float:use_time[MAX_PLAYERS + 1];
        game_time = get_gametime();

        if(use_time[id] > game_time)
        {
            client_print(id, print_center, "Перезарядка способности..");
            return HC_CONTINUE;
        }
       
        use_time[id] = game_time + ARSON_COOLDOWN;

        UseAbility(id);
    }

    return HC_CONTINUE;
}
Я всего лишь хочу, чтобы при исп. "+use" выводилось сообщение о перезарядке, но если закончились заряды, то выводило ТОЛЬКО, что "больше нету". В принципе так у меня получилось, если бы не:
[Battle Mod] У вас больше нет зарядов поджога!
[Battle Mod] У вас больше нет зарядов поджога!
[Battle Mod] У вас больше нет зарядов поджога!

Огромное количество дублей при одноразовом нажатии на Е, когда закончились заряды...
p.s. Где можно почитать подробно про HC_*** ? А то не могу в них разобраться до конца :)
Я хочу просто оборвать дальнейшее выполнение этого "public" на выводе, что нету больше зарядов и чтобы не было повторов этого вывода, но не знаю, как это сделать :D
 
Сообщения
3,583
Реакции
1,572
Помог
138 раз(а)
ThePhoenix, потому что ты делаешь это в пресинке, который вызывается столько раз в секунду, сколько у тебя фпс.
 

Ayk

Сообщения
763
Реакции
478
Помог
19 раз(а)
ThePhoenix, prethink это покадровый форвард. Создай фильтр-счетчик который задержит выполнение кода на нужное число кадров.
 
Сообщения
3,583
Реакции
1,572
Помог
138 раз(а)
Ayk, я бы лучше true в булевом массиве выставил, что сообщение отправлено, и обнуление тогда, когда способность перезаряжена, или что там.
 
Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
RG_CBasePlayer_UseEmpty возможно подойдет (если нужно чекнуть нажатие, но одноразовое)
 
Сообщения
702
Реакции
54
Nordic Warrior, убрал с синка, переместил в "public bool:UseAbility(id)", такая же тема :D Может потому что бул юзется в пресинке :)
Ayk, банально не знаю и не умею
 
Сообщения
198
Реакции
16
Помог
1 раз(а)
чисто вариант: хук +use
 
Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
ThePhoenix, точно так же как и другие хуки ReAPI, собственно как хукали и PreThink
 
Сообщения
702
Реакции
54
блин
Не работает так же:
Код:
RegisterHookChain(RG_CBasePlayer_UseEmpty, "CBasePlayer_UseEmpty", 0);
//AMXXPC compile.exe
// by the AMX Mod X Dev Team


//// class_alchemist_VIP.sma
//
// T:\cs16 SERVER\Compiler amxx BUILD 5263\include\reapi_gamedll_const.inc(763) : error 021: symbol already defined: "RG_CBasePlayer_UseEmpty"
// T:\cs16 SERVER\Compiler amxx BUILD 5263\class_alchemist_VIP.sma(40) : error 029: invalid expression, assumed zero
// T:\cs16 SERVER\Compiler amxx BUILD 5263\class_alchemist_VIP.sma(40) : warning 215: expression has no effect
// T:\cs16 SERVER\Compiler amxx BUILD 5263\class_alchemist_VIP.sma(40) : warning 215: expression has no effect
// T:\cs16 SERVER\Compiler amxx BUILD 5263\class_alchemist_VIP.sma(40) : error 001: expected token: ";", but found ")"
// T:\cs16 SERVER\Compiler amxx BUILD 5263\class_alchemist_VIP.sma(40) : error 029: invalid expression, assumed zero
// T:\cs16 SERVER\Compiler amxx BUILD 5263\class_alchemist_VIP.sma(40) : fatal error 107: too many error messages on one line
//
// Compilation aborted.
// 5 Errors.
// Could not locate output file T:\cs16 SERVER\Compiler amxx BUILD 5263\compiled\class_alchemist_VIP.amx (compile failed).
//
// Compilation Time: 0,37 sec
// ----------------------------------------

Press enter to exit ...
 
Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
ThePhoenix, мы не знаем какая может быть ошибка, стоило хотя бы прикладывать то что выдаёт. Предположу что у Вас старая версия ReAPI и соответственно в include файлах его просто нет.
 
Сообщения
702
Реакции
54
w0w, я приложил и в инклюдах он есть, ибо пишет, что в gamedll already defined
 
Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
ThePhoenix, не испытываю никаких проблем, компилируется всё нормально на > 1.9.0

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

public plugin_init()
{
    RegisterHookChain(RG_CBasePlayer_UseEmpty, "refwd_PlayerUseEmpty_Post", true);
}

public refwd_PlayerUseEmpty_Post(const id)
{
    //
}
 
Сообщения
702
Реакции
54
w0w, теперь просто при нажатии на E ничего не происходит

Код:
public refwd_PlayerUseEmpty_Post(const id)
{
    if(!is_user_alive(id))
        return HC_CONTINUE;

    if(bm_get_player_class(id) != class_id)
        return HC_CONTINUE;

    if(get_entvar(id, var_button) & IN_USE) {
    
        if(arson_num[id] >= MAX_ARSONS)
        {
            client_print_color(id, print_team_default, "^1[^4Battle Mod^1] У вас больше нет зарядов поджога!");
            return HC_BREAK;
        }
        
        static Float:game_time, Float:use_time[MAX_PLAYERS + 1];
        game_time = get_gametime();

        if(use_time[id] > game_time)
        {
            client_print(id, print_center, "Перезарядка способности..");
            return HC_CONTINUE;
        }
        
        use_time[id] = game_time + ARSON_COOLDOWN;
        
        UseAbility(id);
    }
    return HC_CONTINUE;
}
 
Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
Так как этот хук уже подразумевает нажатие E (без использования func_button и прочего), то и проверять нажал ли игрок на E нет смысла. Тем более нет смысла использовать HC_BREAKда и вообще скорее всего ни в одном плагине в 99% случаев не пригодится это, стоит в документации посмотреть что именно делает каждый тип, в этом случае хватит просто HC_CONTINUE, хоть на самом деле вообще не повлияет ибо это Post хук.
 
Сообщения
702
Реакции
54
w0w, HC_BREAK по идее заканчивает выполнения кода. Я уже пробую без проверки на использование Е
 
Сообщения
702
Реакции
54
w0w, спасибо за совет.

Код:
public refwd_PlayerUseEmpty_Post(const id)

{

        if(arson_num[id] >= MAX_ARSONS)

        {

            client_print_color(id, print_team_default, "^1[^4Battle Mod^1] У вас больше нет зарядов поджога!");

            return HC_CONTINUE;

        }

      

        static Float:game_time, Float:use_time[MAX_PLAYERS + 1];

        game_time = get_gametime();



        if(use_time[id] > game_time)

        {

            client_print(id, print_center, "Перезарядка способности..");

            return HC_CONTINUE;

        }

      

        use_time[id] = game_time + ARSON_COOLDOWN;

      

        UseAbility(id);

      

    return PLUGIN_CONTINUE

}
не работает. просто ничего не происходит.
 
Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
Стоит хотя бы убедиться что хук вообще работает на сервере

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

public plugin_init()
{
    RegisterHookChain(RG_CBasePlayer_UseEmpty, "refwd_PlayerUseEmpty_Post", true);
}

public refwd_PlayerUseEmpty_Post(const id)
{
    client_print(id, print_chat, "+use button pressed");
}
Если не работает, то это тогда ReAPI вероятнее всего не обновлено
 
Сообщения
702
Реакции
54
w0w, не работает, но у меня ReAPI той же версии, что и на devcs указано)

[14] ReAPI RUN - reapi_amxx_i386.so v5.12.0.192-dev pl4 ANY Never

p.s. сорри, мой фэйл, потерял один знак -_-
25 Фев 2020
Работает, как мне и нужно было, спасибо! :)
 
Статус
В этой теме нельзя размещать новые ответы.

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

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