Неправильные углы var_angles после телепорта

Сообщения
78
Реакции
65
Когда прыгаешь в телепорт с зажатой клавишей A или D, то вектор скорости (который как видно из кода ниже получен из var_angles) остаётся тем же который был перед телепортом, но если не зажимать A или D, то прыгаешь прямо. В обоих случаях после телепорта игрок смотрит прямо.

Плагин ставит игроку скорость 2000 на каждом прыжке:
Код:
        //хук
        RegisterHookChain(RG_CBasePlayer_Jump, "HC_CBasePlayer_Jump_Pre", false);
        //код в нём
        get_entvar(id, var_angles, fAngles);
        fVelocity[0] = floatcos(fAngles[1], degrees) * 2000.0;
        fVelocity[1] = floatsin(fAngles[1], degrees) * 2000.0;
Как сделать так чтобы кнопки A и D не оставляли пред-телепортные углы у игрока?

Вот пример на видео:
 

Вложения

Сообщения
3,593
Реакции
1,576
Помог
141 раз(а)
Лови тач пост игрока и телепорта и обнуляй там углы
 
Сообщения
78
Реакции
65
Nordic Warrior, В touch_post углы уже по нулям, а в pre нет.

Даже когда в HC_CBasePlayer_Jump_Pre поставил принудительно углы по нулям и казалось бы ты всегда будешь прыгать в одном направлении, но нет проблема осталась. Более того как бы ты не крутился конечный velocity всегда остаётся фактически одинаковым (через client_print видно), но как и раньше игрок после телепорта летит в то же направление что и до телепорта если нажаты A или D.


Код:
#include <amxmodx>
#include <cstrike>
#include <engine>
#include <fakemeta>
#include <beams>
#include <hamsandwich>
#include <reapi>

#define PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "author"

public plugin_init() {

    register_plugin(PLUGIN, VERSION, AUTHOR)
    RegisterHookChain(RG_CBasePlayer_Jump, "HC_CBasePlayer_Jump_Pre", 0);
}

public HC_CBasePlayer_Jump_Pre(id)
{


    new flags = get_entvar(id, var_flags);

    if((flags & FL_WATERJUMP) || !(flags & FL_ONGROUND)  || get_entvar(id, var_waterlevel) >= 2) return HC_CONTINUE;

    new Float:fVelocity[3], Float:fAngles[3];
    // get_entvar(id, var_angles, fAngles);
    // get_entvar(id, var_v_angle, fAngles);


    xs_vec_set(fAngles, 0.0, 0.0, 0.0)

    fVelocity[0] = floatcos(fAngles[1], degrees) * 2000.0;
    fVelocity[1] = floatsin(fAngles[1], degrees) * 2000.0;

    fVelocity[2] = 268.32815729997476356910084024775;

    client_print(id, print_chat, "jump_pre %f %f %f", fVelocity[0], fVelocity[1], fVelocity[2])

    set_entvar(id, var_velocity, fVelocity);
    set_entvar(id, var_gaitsequence, 6);

    return HC_CONTINUE;
}
 

Garey

ninjaCow
Сообщения
440
Реакции
1,094
Помог
11 раз(а)
как вариант хукнуть touch pre и post телепорта потом восстановить углы в post.
 
Сообщения
78
Реакции
65
Garey, говорю же, даже если принудительно выставить углы на 0, то баг остаётся. Иными словами те значения которые ставишь в jump_pre вообще не соответствуют тому что затем происходит с игроком после телепорта. То есть если я углы как ты сказал перекину из пре в пост тач, то в цифрах изменения будут, но баг останется.
 

Garey

ninjaCow
Сообщения
440
Реакции
1,094
Помог
11 раз(а)
Lopol2010, var_angles это не вектор скорости (сохрани еще velocity в pre/post touch)
 
Сообщения
78
Реакции
65
Garey, Да но как видно по исходнику углы конвертируются в вектор велосити, и когда я вывожу в чат конечный велосити после телепорта то он одинаковый, но поведение при этом разное с жататыми кнопками a d и без них
 

Garey

ninjaCow
Сообщения
440
Реакции
1,094
Помог
11 раз(а)
Lopol2010 Я все равно не понял что за проблема у тебя и какое поведение плагина ты хочешь добиться.
Код:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>

static cvar_gravity;

public plugin_init()
{
    RegisterHam(Ham_Touch,"trigger_teleport","fwd_TriggerTeleport", .Post=0);
    RegisterHam(Ham_Player_Jump, "player", "HC_CBasePlayer_Jump_Pre", .Post=1);
    cvar_gravity = get_cvar_pointer("sv_gravity");
}

static Float:height = 45.0;

public HC_CBasePlayer_Jump_Pre(const id)
{
    static Float:velocity[3];
    velocity_by_aim(id, 2000, velocity);
    velocity[2] = floatsqroot( 2.0 * get_pcvar_float(cvar_gravity) * pev(id, pev_gravity) * height );

    set_pev(id, pev_velocity, velocity);   
}

public fwd_TriggerTeleport(const ent, const id)
{
    static Float:angles[3];
    static Float:velocity[3]
    if(is_user_connected(id))
    {
        pev(id, pev_v_angle, angles);
        pev(id, pev_velocity, velocity);
        ExecuteHam(Ham_Touch, ent, id);
        set_pev(id, pev_velocity, velocity);
        set_pev(id, pev_angles, angles);
        set_pev(id, pev_fixangle, 1);     
        return HAM_SUPERCEDE;
    }   
    return HAM_IGNORED;
}
Такой пример нормально работает.
 
Сообщения
78
Реакции
65
Garey, нужно чтобы после телепорта игрок прыгал туда куда направлен его взгляд, а не туда куда он был направлен до телепорта. Посмотри на видео в шапке, первый раз после телепорта игрок смотрит прямо, но его скорость направлена туда же куда была до телопрта, так НЕ надо. А во второй раз, когда после телепорта игрок НЕ жмёт A или D он внезапно начинает прыгать туда куда смотрит но уже после телепорта а не до, то есть по прямой. В общем НЕ нужен рассинхрон углов обзора с направлением скорости после телепорта.
29 Июл 2021
Garey, спасибо за попытку помочь, но то что ты предлагаешь это синхронизировать угол обзора с вектором скорости, а мне нужно наоборот.
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
как вариант после телепорта сбросить скорость
Код:
RegisterHam(Ham_Touch, "trigger_teleport", "hamfwd_TouchTeleport_Post", true);


public hamfwd_TouchTeleport_Post(iEnt, id)
{
    new Float:Origin[3]
    get_entvar(id, var_origin, Origin)
    set_entvar(id,var_origin, Origin);
}


не актуально
 
Последнее редактирование:
Сообщения
2,751
Реакции
3,017
Помог
61 раз(а)
На сколько я понял, нужно выставлять правильный velocity в POST тача телепорта, чтобы после телепорта игрок не летел в ту же сторону, что была до телепорта.

Изначальный угол после телепорта можно получать у pev->target в поле v.angles и уже по нему строить velocity с учётом необходимых корректировок
 
Последнее редактирование:

Garey

ninjaCow
Сообщения
440
Реакции
1,094
Помог
11 раз(а)
SergeyShorokhov, Он и так не летит в направление до телепорта без кастомных плагинов/модулей.
 
Сообщения
78
Реакции
65
В общем нашел одно решение - после телепорта двигать игрока на 2.0 юнита вверх.
11 Авг 2021
Обожаю тратить несколько часов на то, что решается одной строкой (нет)
 

Вложения

iPlague

♿️
Сообщения
230
Реакции
130
Помог
2 раз(а)
SergeyShorokhov, это может быть из-за соприкосновения с поверхностью?
 
Сообщения
78
Реакции
65
SergeyShorokhov, Ничего конкретного, всё что я узнал это:
При нажатой кнопке A или D и после телепорта, если игроку до земли меньше 3.0 юнитов, то баг проявляется тем чаще, чем ближе игрок к земле.
 

iPlague

♿️
Сообщения
230
Реакции
130
Помог
2 раз(а)
Lopol2010, вектор вращения нельзя задать если игрок не имеет вертикальной скорости
 
Сообщения
78
Реакции
65
iPlague, не понял ничего, намекаешь что плагин бхопа ставит вертикальную скорость и это вызывает баг? А как тогда бхопить...
 

iPlague

♿️
Сообщения
230
Реакции
130
Помог
2 раз(а)
Lopol2010, когда ты поднимаешь игрока на 2 юнита после тп, ему можно задать вращение. когда он стоит на поверхности, ему нельзя задать вращение.

гипотеза.
 

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

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