Некорректно работает изменение скорости игроку через ReAPI

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
113
Реакции
26
Приветствую!
Столкнулся с такой проблемой.
Меняю скорость игроку на пониженную, но движение полностью замирает.
Одновременно с понижением скорости, запускаю таск, который через определенное время должен нормализовать скорость игроку.
А получается следующее:
1. понижая скорость, игрок стоит на месте, пока не сменит оружие, но скорость становится не пониженной, которую я задавал, а стандартной.
2. Когда произошел сброс скорости, в первом случае, таск то запущен и, когда он активирует нормализацию скорости, то игрок снова останавливается; вернуть движение возможно только путем переключения оружия в руках.
Подскажите, пожалуйста, как поправить данный баг.
Код:
#include <amxmodx>
#include <reapi>

#define PLUGIN "Speed"
#define VERSION "1.0"
#define AUTHOR "Admin"

#define PREFIX "^1[^4SPEED^1]"
#define MSG_GIVE_SPEED "%s ^3Ваша скорость уменьшена на ^4%d ^3сек."

#define VALUE_SPEED 0.5
#define DURATION_SPEED 30.0

public plugin_init()
{
    register_plugin( PLUGIN, VERSION, AUTHOR )
    register_clcmd("say /spd", "Test");
}

public Test(id) {
    set_entvar(id, var_maxspeed, Float:VALUE_SPEED);
    set_task(Float:DURATION_SPEED, "NormalValues", id);
    client_print_color(id, print_team_red, MSG_GIVE_SPEED, PREFIX, DURATION_SPEED);
    
    return 0;
}

public NormalValues(id) {
    set_entvar(id, var_maxspeed, 1.0);

    return 0;
}
 
Сообщения
271
Реакции
348
Помог
15 раз(а)
Хукайте RG_CBasePlayer_ResetMaxSpeed

И это не стандартная скорость игрока: set_entvar(id, var_maxspeed, 1.0);
 
Сообщения
15
Реакции
11
MIRDOBRO777, Скорость сбрасывается на дефолт, с помощью rg_reset_maxspeed(player), а устанавливается в RG_CBasePlayer_ResetMaxSpeed
1 Авг 2019
MIRDOBRO777, Вот пример
Код:
#include <amxmodx>
#include <reapi>

#define PLUGIN "Speed"
#define VERSION "1.0"
#define AUTHOR "Admin"
#define PREFIX "^1[^4SPEED^1]"
#define MSG_GIVE_SPEED "%s ^3Ваша скорость уменьшена на ^4%d ^3сек."

#define VALUE_SPEED 0.5
#define DURATION_SPEED 30

new g_bSpeed[MAX_PLAYERS+1];

public plugin_init() {
    register_plugin( PLUGIN, VERSION, AUTHOR )
    register_clcmd("say /spd", "Test");
    
    RegisterHookChain(RG_CBasePlayer_ResetMaxSpeed, "@CBasePlayer_ResetMaxSpeed_Post", .post = true);
}

@CBasePlayer_ResetMaxSpeed_Post(const this) {
    if(g_bSpeed[id]) {
           set_entvar(this, var_maxspeed, VALUE_SPEED);
    }
}

public Test(id) {
    g_bSpeed[id] = true;
    rg_reset_maxspeed(player);
    set_task(DURATION_SPEED.0, "NormalValues", id);
    client_print_color(id, print_team_red, MSG_GIVE_SPEED, PREFIX, DURATION_SPEED);
}

public NormalValues(id) {
    g_bSpeed[id] = false;
    rg_reset_maxspeed(player)
}
1 Авг 2019
И индексы в rg_reset_maxspeed замените, на требуемые id. Упустил
 
Сообщения
113
Реакции
26
И это не стандартная скорость игрока: set_entvar(id, var_maxspeed, 1.0);
Спасибо за отклик и подсказку. А на счет скорости, я думал как и с гравой, но понял, что нужно указывать фактическую скорость.
Код:
    RegisterHookChain(RG_CBasePlayer_ResetMaxSpeed, "@CBasePlayer_ResetMaxSpeed_Post", .post = true);
    if(g_bSpeed[id]) {

    g_bSpeed[id] = true/false;
    rg_reset_maxspeed(player);
Спасибо за подробный код.
Я не регистрировал хук и не знал, что функцию можно использовать без "bool:".
Все отлично работает.
Еще вопрос небольшой, а с гравой также можно проделать?
 
Сообщения
15
Реакции
11
Еще вопрос небольшой, а с гравой также можно проделать?
Гравитацию можно устанавливать с помощью set_entvar(id, var_gravity, 0.5);(ReAPI).
Что бы вернуть гравитацию в нормальное состояние, ставим значение 1.0.
 
Сообщения
113
Реакции
26
JustGamer, теперь мучаюсь с гравитацией.
Вроде сделал все как надо, но получилось не работоспособно...
Вот код, что сделал я:
Код:
#include <amxmodx>
#include <reapi>

#define GetCvarDesc(%0) fmt("%L", LANG_SERVER, %0)
new Float:iLowGravity, iGravityDuration;

#define PREFIX "^1[^4TEST^1]"
#define MSG_GIVE_GRAVITY "%s ^4Ваша гравитация ^3понижена ^4на ^3%d ^4сек."

public plugin_init() {
    register_plugin("Testing", "1.0", "Admin");
    register_dictionary("test.txt");
    register_clcmd("say /r", "@Test");

    new pCvarLowGravity = create_cvar("rulya_low_gravity", "0.50", FCVAR_NONE, GetCvarDesc("RULYA_CVAR_LOW_GRAVITY"), true, 1.0, true, 0.01);
    new pCvarGravityDuration = create_cvar("rulya_gravity_duration", "50", FCVAR_NONE, GetCvarDesc("RULYA_CVAR_GRAVITY_DURATION"), true, 1.0);
    bind_pcvar_float(pCvarLowGravity, iLowGravity);
    iGravityDuration = get_pcvar_num(pCvarGravityDuration);

    AutoExecConfig(true, "test");
}

@Test(id) {
    set_entvar(id, var_gravity, iLowGravity);
    new Float:TaskGravity = float(iGravityDuration);
    set_task(TaskGravity, "NormalValues", id + TASK_NORMAL);
    client_print_color(id, print_team_red, MSG_GIVE_GRAVITY, PREFIX, iGravityDuration);
    client_cmd(id,"spk buttons/button1.wav");
}

public NormalValues(id) {
    id -= TASK_NORMAL
    set_entvar(id, var_gravity, 1.00);
    client_cmd(id,"spk buttons/button1.wav");
}
А вот такую ошибку бьет в логах:
L 08/03/2019 - 16:56:13: [AMXX] Run time error 10: native error (native "create_cvar")
L 08/03/2019 - 16:56:13: [AMXX] [0] s.sma::plugin_init (line 16)

Что не так, ведь компилится без предупреждений
Соответственно граву не выдает и файл с настройками не создает.
Подскажите, пожалуйста, что я снова не так пишу.
 
Сообщения
15
Реакции
11
MIRDOBRO777, у тебя минимальное значение превышает максимальное, в create_cvar("rulya_low_gravity", "0.50", FCVAR_NONE, GetCvarDesc("RULYA_CVAR_LOW_GRAVITY"), true, 1.0, true, 0.01);
=>
create_cvar("rulya_low_gravity", "0.50", FCVAR_NONE, GetCvarDesc("RULYA_CVAR_LOW_GRAVITY"), true, 0.1, true, 1.0);
 
Сообщения
113
Реакции
26
Ребята, можно я в этой теме продолжу просить о подсказках, не создавая новую тему?
Не будет это нарушением?
Чтобы не писать дважды сообщение, накидал очередную проблемку с кодом.
Сам код:
Код:
#include <amxmodx>
#include <reapi>

#define GetCvarDesc(%0) fmt("%L", LANG_SERVER, %0)
new iFadeColor, iFadeTime, gMsgScreenFade, g_iFadeColor[4];
new szColor[20], szRed[4], szGreen[4], szBlue[4], szAlpha[4];
#define MSG_GIVE "^3Действие ^4%d сек."
new const TASK_NORMAL = 101

public plugin_init() {
    register_plugin("Testing", "1.0", "Admin");
    register_dictionary("test.txt");
    register_clcmd("say /r", "@Test");

    gMsgScreenFade = get_user_msgid("ScreenFade");

    new pCvarFadeColor = create_cvar("rulya_fade_color", "0 0 0 255", FCVAR_NONE, GetCvarDesc("RULYA_CVAR_FADE_COLOR"), true, 0.0, true, 255.0);
    new pCvarFadeTime = create_cvar("rulya_fade_time", "10", FCVAR_NONE, GetCvarDesc("RULYA_CVAR_FADE_TIME"), true, 5.0);

    iFadeColor = get_pcvar_num(pCvarFadeColor);
    iFadeTime = get_pcvar_num(pCvarFadeTime);

    AutoExecConfig(true, "test");

    get_pcvar_string(iFadeColor, szColor, 19);
    parse(szColor, szRed, 4, szGreen, 4, szBlue, 4, szAlpha, 4);
    g_iFadeColor[0] = str_to_num(szRed);
    g_iFadeColor[1] = str_to_num(szGreen);
    g_iFadeColor[2] = str_to_num(szBlue);
    g_iFadeColor[3] = str_to_num(szAlpha);
}

@Test(id) {
    UTIL_ScreenFade(id, 1);
    set_task(10.0, "NormalValues", id + TASK_NORMAL);
    client_print_color(id, print_team_red, MSG_GIVE, iFadeTime);
    client_cmd(id,"spk buttons/button1.wav");
}

public NormalValues(id) {
    id -= TASK_NORMAL
    UTIL_ScreenFade(id, 0);
    client_cmd(id,"spk buttons/button1.wav");
}

UTIL_ScreenFade(const iClient, iFade = 1) {
    message_begin(MSG_ONE, gMsgScreenFade, _, iClient)
    write_short(7500 * iFade);
    write_short(7500 * iFade);
    write_short(0x0000);
    write_byte( g_iFadeColor[ 0 ] );
    write_byte( g_iFadeColor[ 1 ] );
    write_byte( g_iFadeColor[ 2 ] );
    write_byte( g_iFadeColor[ 3 ] );
    message_end();
}
А вот ошибка:
L 08/07/2019 - 00:25:11: [AMXX] Run time error 10: native error (native "get_pcvar_string")
L 08/07/2019 - 00:25:11: [AMXX] [0] s.sma::plugin_init (line 28)
Строки немного сместил, но ругается на вот эту:
get_pcvar_string(iFadeColor, szColor, 19);
Я так понял не может получить значение квара, но почему. Вроде бы все правильно скопировал с другого плагина.
Подскажите, пожалуйста, на мою ошибку в коде.
И соответственно не затемняется экран, хотя суть плагина именно в затемнении экрана на определенное время.
 

Ayk

Сообщения
763
Реакции
478
Помог
19 раз(а)
Код:
    iFadeColor = get_pcvar_num(pCvarFadeColor);
    iFadeTime = get_pcvar_num(pCvarFadeTime);

    AutoExecConfig(true, "test");

    get_pcvar_string(iFadeColor, szColor, 19);
iFadeColor не указатель.

Код:
--get_pcvar_string(iFadeColor, szColor, 19)
++get_pcvar_string(pCvarFadeColor, szColor, charsmax(szColor))
 
Статус
В этой теме нельзя размещать новые ответы.

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

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