Вопрос Jumpbug missing

  • Автор темы Автор темы ayi
  • Дата начала Дата начала
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
5 Мар 2022
Сообщения
109
Реакции
8
кароче, у мя получилось сделать хотя бы какой то джампбаг, и да он работает не плохо, но все равно очень часто миссы, не попадает в тайминги. если кто то может, помогите это пофиксить

Код:
Expand Collapse Copy
void c_movement::jump_bug()
{
    if (!(g_ctx->m_user_cmd->m_button_state.m_button_state & IN_JUMP))
        return;

    if (!g_configs->misc.m_jumpbug)
        return;

    if (!g_interfaces->m_var->get_by_name("sv_autobunnyhopping")->get_bool())
        return;

    c_user_cmd* cmd = g_ctx->m_user_cmd;
    CBaseUserCmdPB* base_cmd = g_ctx->m_user_cmd->pb.mutable_base();

    auto pawn = g_ctx->m_local_pawn;
    if (!pawn)
        return;

    auto movement = pawn->m_movement_services();
    if (!movement)
        return;

    bool edge_detected = false;
    if ((pawn->m_flags() & FL_ONGROUND) && !(g_prediction->get_post_flags() & FL_ONGROUND))
    {
        vec3_t origin = pawn->m_scene_node()->m_abs_origin();

        auto collision = pawn->m_collision();
        if (collision)
        {
            vec3_t mins = collision->m_mins();
            vec3_t maxs = collision->m_maxs();

            trace_filter_t filter;
            g_interfaces->m_trace->init_player_movement_trace_filter(&filter, pawn, 0x1C3003, COLLISION_GROUP_PLAYER_MOVEMENT);

            vec3_t start = origin;
            vec3_t end = origin - vec3_t(0, 0, 32.0f);

            game_trace_t trace;
            bbox_t bounds = { mins, maxs };

            if (g_interfaces->m_trace->trace_player_bbox(&start, &end, &bounds, &filter, &trace))
            {
                edge_detected = trace.m_fraction >= 1.0f || !trace.m_hit_entity;
            }
        }
    }

    if (((pawn->m_flags() & FL_ONGROUND) && !(g_prediction->get_post_flags() & FL_ONGROUND)) || edge_detected)
    {
        cmd->m_button_state.set_button_state(IN_DUCK, IN_BUTTON_DOWN);

        base_cmd->clear_subtick_moves();

        if (auto duck_subtick = g_interfaces->m_csgo_input->create_new_subtick_move_step(base_cmd->mutable_subtick_moves()))
        {
            duck_subtick->set_when(0.f);
            duck_subtick->set_button(IN_DUCK);
            duck_subtick->set_pressed(true);
            base_cmd->mutable_subtick_moves()->AddAllocated(duck_subtick);
        }

        if (auto jump_subtick = g_interfaces->m_csgo_input->create_new_subtick_move_step(base_cmd->mutable_subtick_moves()))
        {
            jump_subtick->set_when(0.25f);
            jump_subtick->set_button(IN_JUMP);
            jump_subtick->set_pressed(true);
            base_cmd->mutable_subtick_moves()->AddAllocated(jump_subtick);
        }

        if (auto unduck_subtick = g_interfaces->m_csgo_input->create_new_subtick_move_step(base_cmd->mutable_subtick_moves()))
        {
            unduck_subtick->set_when(0.999f);
            unduck_subtick->set_button(IN_DUCK);
            unduck_subtick->set_pressed(false);
            base_cmd->mutable_subtick_moves()->AddAllocated(unduck_subtick);
        }

        if (auto unjump_subtick = g_interfaces->m_csgo_input->create_new_subtick_move_step(base_cmd->mutable_subtick_moves())) {
            unjump_subtick->set_when(0.999f);
            unjump_subtick->set_button(IN_JUMP);
            unjump_subtick->set_pressed(false);
            base_cmd->mutable_subtick_moves()->AddAllocated(unjump_subtick);
        }
    }
    else if (!(pawn->m_flags() & FL_ONGROUND))
    {
        cmd->m_button_state.set_button_state(IN_DUCK, IN_BUTTON_UP);
    }
}

по поводу того что у меня стоит чек на квар sv_autobunnyhopping обьясняю, без этого квара бхоп у мя сходит с ума, и даже без джампбага если присесть и отжать duck перед приземлением он перестает работать. возможно что то с предикт флагами кстати, потому что если их убрать почти ничего не поменяется, однако у меня есть post, pre флаги, тестил с обоими, нету разницы, джампбаг так же вызывается под бегин предиктом, сторю флаги вроде корректно
 
Последнее редактирование:
Используй процесс мувмент
 
у мя не дарксайд, я просто перевел на него что бы не палить сдк, скажи по подробнее за что эта функа отвечает
Она отвечает за симуляцию движения игрока, ищи ее в плане, перед ней вызывай сетап мув а после нее финиш мув, они лежат в мув сервисе
 
Она отвечает за симуляцию движения игрока, ищи ее в плане, перед ней вызывай сетап мув а после нее финиш мув, они лежат в мув сервисе
если ты предлагаешь делать вот так, то это кал полнейший, типо педали сразу дохнут, стрейфится нормально невозможно, джампбаг еще хуже


Код:
Expand Collapse Copy
    CMoveData pData;

    pMovementServices->Setup(pCmd, &pData);

    pMovementServices->ProcessMovement(pCmd);

    pMovementServices->Finish(pCmd, &pData);

насколько я знаю, ProcessMovement вызывается самим движком, и это не нужно делать вручную
 
Последнее редактирование:
насколько я знаю, ProcessMovement вызывается самим движком, и это не нужно делать вручную
это не совсем так
его нужно вызывать после или до(точно не помню) PhysicsRunThink в предикшене
 
это не совсем так
его нужно вызывать после или до(точно не помню) PhysicsRunThink в предикшене
после, но можно попробовать и до т.к в process_movement есть вызов run_think а в physics_run_think есть чек на него в самом конце
 
это не совсем так
его нужно вызывать после или до(точно не помню) PhysicsRunThink в предикшене
в предикте у меня вызывается вот так

pMovementServices->SetPredictionCommand( pCmd );
pMovementServices->RunCommand( pCmd );
pMovementServices->ResetPredictionCommand( );

если ты говоришь про что нужно прям ProcessMovement вызывать до или после PhysicsRunThink, то значит я не совсем правильно сделал предикт
 
в предикте у меня вызывается вот так

pMovementServices->SetPredictionCommand( pCmd );
pMovementServices->RunCommand( pCmd );
pMovementServices->ResetPredictionCommand( );

если ты говоришь про что нужно прям ProcessMovement вызывать до или после PhysicsRunThink, то значит я не совсем правильно сделал предикт
зачем ты вызываешь RunCommand ведь за собой он тянет еще достаточно мусора который тебе не нужен.. и правильнй вариант заребилдить его
 
зачем ты вызываешь RunCommand ведь за собой он тянет еще достаточно мусора который тебе не нужен.. и правильнй вариант заребилдить его
без RunCommand у меня не работают ерли автостопы, не знаю как это связано со стопами но вот так вот
 
без RunCommand у меня не работают ерли автостопы, не знаю как это связано со стопами но вот так вот
try

Код:
Expand Collapse Copy
void c_movement::simulate_movement_for_jumpbug(c_user_cmd* cmd)
{
    auto pawn = g_ctx->m_local_pawn;
    if (!pawn)
        return;

    auto movement_services = pawn->m_movement_services();
    if (!movement_services)
        return;

    c_user_cmd temp_cmd = *cmd;
    
    CMoveData move_data;
    movement_services->Setup(&temp_cmd, &move_data);
    
    pawn->PhysicsRunThink(0);
    
    movement_services->ProcessMovement(&temp_cmd);
    
    movement_services->Finish(&temp_cmd, &move_data);
}

void c_movement::jump_bug()
{
    if (!(g_ctx->m_user_cmd->m_button_state.m_button_state & IN_JUMP))
        return;

    if (!g_configs->misc.m_jumpbug)
        return;

    if (!g_interfaces->m_var->get_by_name("sv_autobunnyhopping")->get_bool())
        return;

    c_user_cmd* cmd = g_ctx->m_user_cmd;
    CBaseUserCmdPB* base_cmd = g_ctx->m_user_cmd->pb.mutable_base();

    auto pawn = g_ctx->m_local_pawn;
    if (!pawn)
        return;

    auto movement = pawn->m_movement_services();
    if (!movement)
        return;

    int original_flags = pawn->m_flags();
    vec3_t original_origin = pawn->m_scene_node()->m_abs_origin();
    vec3_t original_velocity = pawn->m_velocity();
    
    simulate_movement_for_jumpbug(cmd);
    
    int predicted_flags = pawn->m_flags();
    
    pawn->m_flags() = original_flags;
    pawn->m_scene_node()->m_abs_origin() = original_origin;
    pawn->m_velocity() = original_velocity;
    
    
    bool was_on_ground = (original_flags & FL_ONGROUND);
    bool will_be_on_ground = (predicted_flags & FL_ONGROUND);
    
    bool edge_detected = false;
    if (was_on_ground && !will_be_on_ground)
    {
        vec3_t origin = original_origin;
        vec3_t velocity = original_velocity;
        
        auto collision = pawn->m_collision();
        if (collision)
        {
            vec3_t mins = collision->m_mins();
            vec3_t maxs = collision->m_maxs();

            trace_filter_t filter;
            g_interfaces->m_trace->init_player_movement_trace_filter(&filter, pawn, 0x1C3003, COLLISION_GROUP_PLAYER_MOVEMENT);

            if (velocity.length_2d() > 50.0f)
            {
                vec3_t forward_pos = origin + velocity.normalized() * 24.0f;
                forward_pos.z -= 32.0f;
                
                game_trace_t forward_trace;
                bbox_t bounds = { mins, maxs };
                
                if (g_interfaces->m_trace->trace_player_bbox(&origin, &forward_pos, &bounds, &filter, &forward_trace))
                {
                    edge_detected = forward_trace.m_fraction >= 0.95f;
                }
            }
            
            if (!edge_detected)
            {
                vec3_t down_pos = origin - vec3_t(0, 0, 32.0f);
                game_trace_t down_trace;
                bbox_t bounds = { mins, maxs };
                
                if (g_interfaces->m_trace->trace_player_bbox(&origin, &down_pos, &bounds, &filter, &down_trace))
                {
                    edge_detected = down_trace.m_fraction >= 0.9f;
                }
            }
        }
    }

    if ((was_on_ground && !will_be_on_ground) || edge_detected)
    {
        cmd->m_button_state.set_button_state(IN_DUCK, IN_BUTTON_DOWN);
        base_cmd->clear_subtick_moves();

        float interval = g_interfaces->m_globals->m_interval_per_tick;
        float tick_to_prgo = fmodf(g_interfaces->m_globals->m_curtime, interval) / interval;
        
        float duck_timing = 0.0f;
        float jump_timing = 0.2f - (tick_to_prgo * 0.1f);
        float unduck_timing = 0.85f + (tick_to_prgo * 0.05f);
        float unjump_timing = unduck_timing + 0.03f;
        
        float speed = original_velocity.length_2d();
        if (speed > 320.0f)
        {
            jump_timing *= 0.95f;
            unduck_timing *= 1.02f;
        }
        else if (speed < 200.0f)
        {
            jump_timing *= 1.05f;
            unduck_timing *= 0.98f;
        }
        
        if (auto duck_subtick = g_interfaces->m_csgo_input->create_new_subtick_move_step(base_cmd->mutable_subtick_moves()))
        {
            duck_subtick->set_when(duck_timing);
            duck_subtick->set_button(IN_DUCK);
            duck_subtick->set_pressed(true);
            base_cmd->mutable_subtick_moves()->AddAllocated(duck_subtick);
        }

        if (auto jump_subtick = g_interfaces->m_csgo_input->create_new_subtick_move_step(base_cmd->mutable_subtick_moves()))
        {
            jump_subtick->set_when(jump_timing);
            jump_subtick->set_button(IN_JUMP);
            jump_subtick->set_pressed(true);
            base_cmd->mutable_subtick_moves()->AddAllocated(jump_subtick);
        }

        if (auto unduck_subtick = g_interfaces->m_csgo_input->create_new_subtick_move_step(base_cmd->mutable_subtick_moves()))
        {
            unduck_subtick->set_when(unduck_timing);
            unduck_subtick->set_button(IN_DUCK);
            unduck_subtick->set_pressed(false);
            base_cmd->mutable_subtick_moves()->AddAllocated(unduck_subtick);
        }

        if (auto unjump_subtick = g_interfaces->m_csgo_input->create_new_subtick_move_step(base_cmd->mutable_subtick_moves()))
        {
            unjump_subtick->set_when(unjump_timing);
            unjump_subtick->set_button(IN_JUMP);
            unjump_subtick->set_pressed(false);
            base_cmd->mutable_subtick_moves()->AddAllocated(unjump_subtick);
        }
    }
    else if (!(original_flags & FL_ONGROUND))
    {
        cmd->m_button_state.set_button_state(IN_DUCK, IN_BUTTON_UP);
    }
}
 
try

Код:
Expand Collapse Copy
void c_movement::simulate_movement_for_jumpbug(c_user_cmd* cmd)
{
    auto pawn = g_ctx->m_local_pawn;
    if (!pawn)
        return;

    auto movement_services = pawn->m_movement_services();
    if (!movement_services)
        return;

    c_user_cmd temp_cmd = *cmd;
  
    CMoveData move_data;
    movement_services->Setup(&temp_cmd, &move_data);
  
    pawn->PhysicsRunThink(0);
  
    movement_services->ProcessMovement(&temp_cmd);
  
    movement_services->Finish(&temp_cmd, &move_data);
}

void c_movement::jump_bug()
{
    if (!(g_ctx->m_user_cmd->m_button_state.m_button_state & IN_JUMP))
        return;

    if (!g_configs->misc.m_jumpbug)
        return;

    if (!g_interfaces->m_var->get_by_name("sv_autobunnyhopping")->get_bool())
        return;

    c_user_cmd* cmd = g_ctx->m_user_cmd;
    CBaseUserCmdPB* base_cmd = g_ctx->m_user_cmd->pb.mutable_base();

    auto pawn = g_ctx->m_local_pawn;
    if (!pawn)
        return;

    auto movement = pawn->m_movement_services();
    if (!movement)
        return;

    int original_flags = pawn->m_flags();
    vec3_t original_origin = pawn->m_scene_node()->m_abs_origin();
    vec3_t original_velocity = pawn->m_velocity();
  
    simulate_movement_for_jumpbug(cmd);
  
    int predicted_flags = pawn->m_flags();
  
    pawn->m_flags() = original_flags;
    pawn->m_scene_node()->m_abs_origin() = original_origin;
    pawn->m_velocity() = original_velocity;
  
  
    bool was_on_ground = (original_flags & FL_ONGROUND);
    bool will_be_on_ground = (predicted_flags & FL_ONGROUND);
  
    bool edge_detected = false;
    if (was_on_ground && !will_be_on_ground)
    {
        vec3_t origin = original_origin;
        vec3_t velocity = original_velocity;
      
        auto collision = pawn->m_collision();
        if (collision)
        {
            vec3_t mins = collision->m_mins();
            vec3_t maxs = collision->m_maxs();

            trace_filter_t filter;
            g_interfaces->m_trace->init_player_movement_trace_filter(&filter, pawn, 0x1C3003, COLLISION_GROUP_PLAYER_MOVEMENT);

            if (velocity.length_2d() > 50.0f)
            {
                vec3_t forward_pos = origin + velocity.normalized() * 24.0f;
                forward_pos.z -= 32.0f;
              
                game_trace_t forward_trace;
                bbox_t bounds = { mins, maxs };
              
                if (g_interfaces->m_trace->trace_player_bbox(&origin, &forward_pos, &bounds, &filter, &forward_trace))
                {
                    edge_detected = forward_trace.m_fraction >= 0.95f;
                }
            }
          
            if (!edge_detected)
            {
                vec3_t down_pos = origin - vec3_t(0, 0, 32.0f);
                game_trace_t down_trace;
                bbox_t bounds = { mins, maxs };
              
                if (g_interfaces->m_trace->trace_player_bbox(&origin, &down_pos, &bounds, &filter, &down_trace))
                {
                    edge_detected = down_trace.m_fraction >= 0.9f;
                }
            }
        }
    }

    if ((was_on_ground && !will_be_on_ground) || edge_detected)
    {
        cmd->m_button_state.set_button_state(IN_DUCK, IN_BUTTON_DOWN);
        base_cmd->clear_subtick_moves();

        float interval = g_interfaces->m_globals->m_interval_per_tick;
        float tick_to_prgo = fmodf(g_interfaces->m_globals->m_curtime, interval) / interval;
      
        float duck_timing = 0.0f;
        float jump_timing = 0.2f - (tick_to_prgo * 0.1f);
        float unduck_timing = 0.85f + (tick_to_prgo * 0.05f);
        float unjump_timing = unduck_timing + 0.03f;
      
        float speed = original_velocity.length_2d();
        if (speed > 320.0f)
        {
            jump_timing *= 0.95f;
            unduck_timing *= 1.02f;
        }
        else if (speed < 200.0f)
        {
            jump_timing *= 1.05f;
            unduck_timing *= 0.98f;
        }
      
        if (auto duck_subtick = g_interfaces->m_csgo_input->create_new_subtick_move_step(base_cmd->mutable_subtick_moves()))
        {
            duck_subtick->set_when(duck_timing);
            duck_subtick->set_button(IN_DUCK);
            duck_subtick->set_pressed(true);
            base_cmd->mutable_subtick_moves()->AddAllocated(duck_subtick);
        }

        if (auto jump_subtick = g_interfaces->m_csgo_input->create_new_subtick_move_step(base_cmd->mutable_subtick_moves()))
        {
            jump_subtick->set_when(jump_timing);
            jump_subtick->set_button(IN_JUMP);
            jump_subtick->set_pressed(true);
            base_cmd->mutable_subtick_moves()->AddAllocated(jump_subtick);
        }

        if (auto unduck_subtick = g_interfaces->m_csgo_input->create_new_subtick_move_step(base_cmd->mutable_subtick_moves()))
        {
            unduck_subtick->set_when(unduck_timing);
            unduck_subtick->set_button(IN_DUCK);
            unduck_subtick->set_pressed(false);
            base_cmd->mutable_subtick_moves()->AddAllocated(unduck_subtick);
        }

        if (auto unjump_subtick = g_interfaces->m_csgo_input->create_new_subtick_move_step(base_cmd->mutable_subtick_moves()))
        {
            unjump_subtick->set_when(unjump_timing);
            unjump_subtick->set_button(IN_JUMP);
            unjump_subtick->set_pressed(false);
            base_cmd->mutable_subtick_moves()->AddAllocated(unjump_subtick);
        }
    }
    else if (!(original_flags & FL_ONGROUND))
    {
        cmd->m_button_state.set_button_state(IN_DUCK, IN_BUTTON_UP);
    }
}
сломался стрейфер фулл
у меня ProcessMovement из мув сервиса, надо из павна вроде бы


Код:
Expand Collapse Copy
  __int64 ProcessMovement(CUserCmd* pCmd)
  {
    static auto fn = reinterpret_cast<__int64(__fastcall*)(CPlayer_MovementServices*, CUserCmd*)>(Memory::GetAbsoluteAddress(Memory::FindPattern(CLIENT_DLL, "E8 ? ? ? ? 48 8B 06 48 8B CE FF 90 ? ? ? ? 44 38 63 45"), 1));
    return fn(this, pCmd);
  }
 
сломался стрейфер фулл
у меня ProcessMovement из мув сервиса, надо из павна вроде бы


Код:
Expand Collapse Copy
  __int64 ProcessMovement(CUserCmd* pCmd)
  {
    static auto fn = reinterpret_cast<__int64(__fastcall*)(CPlayer_MovementServices*, CUserCmd*)>(Memory::GetAbsoluteAddress(Memory::FindPattern(CLIENT_DLL, "E8 ? ? ? ? 48 8B 06 48 8B CE FF 90 ? ? ? ? 44 38 63 45"), 1));
    return fn(this, pCmd);
  }
твой метод реализации правильный и не нуждается в реворке и также на заметочку как мне известно ProcessMovement только в CCSPlayer_MovementServices
 
Назад
Сверху Снизу