Гайд Продолжение. панорама - меню и кд абилок врагов

Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
кароч ExistedDim4 выяснил оно кодируется в char32_t(нахуя??)

C++:
void clicked( ) {
    CTextEntry* entry = cheat_data.ui_hud->find_child_traverse( "JSText" )->panel2d_as<CTextEntry*>( );
    auto p = entry->wdisplaytext( );

    std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> cv;
    std::cout << cv.to_bytes( p ) << std::endl;
}
да там UTF-32LE
1684584777155.png
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
674
Реакции[?]
106
Поинты[?]
69K
а поч когда я регаю свои ивенты, то старые(как я понял) ломаются или что такое, то есть допустим я регаю эвент на слайдер DOTASettingsSlider
то рядом с текстом при изменении слайдера перестает писатся это число? я конечно понимаю что могу и вручную заменять текст в своем эвенте, но еще есть проблема с DOTASettingsCheckbox, когда я регаю ему ивент "Activated", чтобы отлавливать значения
C++:
const auto Event_FogCheckboxChanged = []( ) -> void {

      panorama_gui.draw_fog = !panorama_gui.draw_fog;

};
FastDelegate0<void> camera_fog_handler( Event_FogCheckboxChanged );

ui_engine.m_pUIEngineSource2->RegisterEventHandler( "Activated", camera_draw_fog, camera_fog_handler );
то он начинает подсвечиватся только через раз, вопрос:
как мне добавлять эвенты а не пересоздавать их?
еще такой прикол со слайдером, почему-то даже без ивента он меняется только кликом, то есть ползунок как в настройках доты не двигается если зажимаю лкм и пытаюсь подвигать.
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
а поч когда я регаю свои ивенты, то старые(как я понял) ломаются или что такое, то есть допустим я регаю эвент на слайдер DOTASettingsSlider
то рядом с текстом при изменении слайдера перестает писатся это число? я конечно понимаю что могу и вручную заменять текст в своем эвенте, но еще есть проблема с DOTASettingsCheckbox, когда я регаю ему ивент "Activated", чтобы отлавливать значения
C++:
const auto Event_FogCheckboxChanged = []( ) -> void {

      panorama_gui.draw_fog = !panorama_gui.draw_fog;

};
FastDelegate0<void> camera_fog_handler( Event_FogCheckboxChanged );

ui_engine.m_pUIEngineSource2->RegisterEventHandler( "Activated", camera_draw_fog, camera_fog_handler );
то он начинает подсвечиватся только через раз, вопрос:
как мне добавлять эвенты а не пересоздавать их?
еще такой прикол со слайдером, почему-то даже без ивента он меняется только кликом, то есть ползунок как в настройках доты не двигается если зажимаю лкм и пытаюсь подвигать.
хз я хукал просто виртуальные функции типа onlmb onrmb onmousemove и тд
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
674
Реакции[?]
106
Поинты[?]
69K
хз я хукал просто виртуальные функции типа onlmb onrmb onmousemove и тд
да для чекбокса все воркает

C++:
bool CPanel2D__OnMouseButtonDown( CPanel2D* rcx, const MouseData_t& code )
{
    if ( rcx == panorama_gui.camera_fog_button->panel2d_as<CPanel2D>( )
 && code.m_mouse_code == MouseCode::MOUSE_LEFT ) {
        panorama_gui.draw_fog = !panorama_gui.draw_fog;
    }

    return reinterpret_cast<decltype( &CPanel2D__OnMouseButtonDown )>( origCPanel2D__OnMouseButtonDown )( rcx, code );
}
а вот для слайдера ни маус мув, ни баттонап не работает, похоже надо как-то самому эти ивенты перепсывать
я в сурсах нашел функу cslider::setvalue, но почему-то такой прикол я смотрю в иде она на индексе 78 лежит, а в реальности ее там нету, ну пришлось сигу сделать 40 57 48 83 EC 30 0F 29 74 24 20 48 8B F9 F3 0F 10 71 40 0F 2F CE 72 09 F3 0F 10 71 44 F3 0F 5D F1 вроде работает так
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
да для чекбокса все воркает

C++:
bool CPanel2D__OnMouseButtonDown( CPanel2D* rcx, const MouseData_t& code )
{
    if ( rcx == panorama_gui.camera_fog_button->panel2d_as<CPanel2D>( )
&& code.m_mouse_code == MouseCode::MOUSE_LEFT ) {
        panorama_gui.draw_fog = !panorama_gui.draw_fog;
    }

    return reinterpret_cast<decltype( &CPanel2D__OnMouseButtonDown )>( origCPanel2D__OnMouseButtonDown )( rcx, code );
}
а вот для слайдера ни маус мув, ни баттонап не работает, похоже надо как-то самому эти ивенты перепсывать
я в сурсах нашел функу cslider::setvalue, но почему-то такой прикол я смотрю в иде она на индексе 78 лежит, а в реальности ее там нету, ну пришлось сигу сделать 40 57 48 83 EC 30 0F 29 74 24 20 48 8B F9 F3 0F 10 71 40 0F 2F CE 72 09 F3 0F 10 71 44 F3 0F 5D F1 вроде работает так
да я сетвалуе юзал
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
674
Реакции[?]
106
Поинты[?]
69K
да я сетвалуе юзал
а можешь подсказать как ты dragging делал?
я у тебя в сурсе увидел там что-то про это
1684903566356.png
но код не фул, можешь сказать что такое inverseresolutionscal?

я попробовал сделать по обычному то есть просто позицию на корды мышки ставить, но двигаю совсем чуть-чуть и улетает меню за экран
C++:
void CPanel2D__OnMouseMove( CPanel2D* rcx, float flMouseX, float flMouseY ) {
    // for dragging
    if ( rcx == panorama_gui.main_panel->panel2d_as( ) && panorama_gui.is_menu_dragging ) {
        const auto style_format{ std::format( "position: {}px {}px 0;", flMouseX, flMouseY ) };
        panorama_gui.main_panel->set_style( style_format );

        std::cout << "mouse: " << flMouseX << " " << flMouseY << std::endl;
        auto panel_style = panorama_gui.main_panel->panel_style( );
        CUILength x, y, z;
        panel_style->GetPosition( x, y, z, false );
        std::cout << std::format("position factor: {} {} {}", x.GetValue( ), y.GetValue( ), z.GetValue( ) ) << std::endl;
        panel_style->GetInterpolatedPosition( x, y, z, true, false );
        std::cout << std::format("position inter final: {} {} {}", x.GetValue( ), y.GetValue( ), z.GetValue( ) ) << std::endl;
        panel_style->GetInterpolatedPosition( x, y, z, false );
        std::cout << std::format("position inter factor: {} {} {}", x.GetValue( ), y.GetValue( ), z.GetValue( ) ) << std::endl;
        panel_style->GetInterpolatedPosition( x, y, z, false, false );
        std::cout << std::format("position inter: {} {} {}", x.GetValue( ), y.GetValue( ), z.GetValue( ) ) << std::endl;
    }

    reinterpret_cast<decltype( &CPanel2D__OnMouseMove )>( panorama_gui.origCPanel2D__OnMouseMove )( rcx, flMouseX, flMouseY );
}

mouse: 562 46
position factor: 562 46 0
position inter final: 562 46 0
position inter factor: 749 61 0
position inter: 562 46 0
mouse: -187 -15
position factor: -187 -15 0
position inter final: -187 -15 0
position inter factor: -249 -20 0
position inter: -187 -15 0
mouse: 811 66
position factor: 811 66 0
position inter final: 811 66 0
position inter factor: 1081 88 0
position inter: 811 66 0
mouse: -519 -42
position factor: -519 -42 0
position inter final: -519 -42 0
position inter factor: -692 -56 0
position inter: -519 -42 0
mouse: 1254 102
position factor: 1254 102 0
position inter final: 1254 102 0
position inter factor: 1672 136 0
position inter: 1254 102 0
mouse: -1110 -90
position factor: -1110 -90 0
position inter final: -1110 -90 0
position inter factor: -1480 -120 0
position inter: -1110 -90 0
mouse: 2042 166
position factor: 2042 166 0
position inter final: 2042 166 0
position inter factor: 2723 221 0
position inter: 2042 166 0
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
а можешь подсказать как ты dragging делал?
я у тебя в сурсе увидел там что-то про это
Посмотреть вложение 248663
но код не фул, можешь сказать что такое inverseresolutionscal?

я попробовал сделать по обычному то есть просто позицию на корды мышки ставить, но двигаю совсем чуть-чуть и улетает меню за экран
C++:
void CPanel2D__OnMouseMove( CPanel2D* rcx, float flMouseX, float flMouseY ) {
    // for dragging
    if ( rcx == panorama_gui.main_panel->panel2d_as( ) && panorama_gui.is_menu_dragging ) {
        const auto style_format{ std::format( "position: {}px {}px 0;", flMouseX, flMouseY ) };
        panorama_gui.main_panel->set_style( style_format );

        std::cout << "mouse: " << flMouseX << " " << flMouseY << std::endl;
        auto panel_style = panorama_gui.main_panel->panel_style( );
        CUILength x, y, z;
        panel_style->GetPosition( x, y, z, false );
        std::cout << std::format("position factor: {} {} {}", x.GetValue( ), y.GetValue( ), z.GetValue( ) ) << std::endl;
        panel_style->GetInterpolatedPosition( x, y, z, true, false );
        std::cout << std::format("position inter final: {} {} {}", x.GetValue( ), y.GetValue( ), z.GetValue( ) ) << std::endl;
        panel_style->GetInterpolatedPosition( x, y, z, false );
        std::cout << std::format("position inter factor: {} {} {}", x.GetValue( ), y.GetValue( ), z.GetValue( ) ) << std::endl;
        panel_style->GetInterpolatedPosition( x, y, z, false, false );
        std::cout << std::format("position inter: {} {} {}", x.GetValue( ), y.GetValue( ), z.GetValue( ) ) << std::endl;
    }

    reinterpret_cast<decltype( &CPanel2D__OnMouseMove )>( panorama_gui.origCPanel2D__OnMouseMove )( rcx, flMouseX, flMouseY );
}

mouse: 562 46
position factor: 562 46 0
position inter final: 562 46 0
position inter factor: 749 61 0
position inter: 562 46 0
mouse: -187 -15
position factor: -187 -15 0
position inter final: -187 -15 0
position inter factor: -249 -20 0
position inter: -187 -15 0
mouse: 811 66
position factor: 811 66 0
position inter final: 811 66 0
position inter factor: 1081 88 0
position inter: 811 66 0
mouse: -519 -42
position factor: -519 -42 0
position inter final: -519 -42 0
position inter factor: -692 -56 0
position inter: -519 -42 0
mouse: 1254 102
position factor: 1254 102 0
position inter final: 1254 102 0
position inter factor: 1672 136 0
position inter: 1254 102 0
mouse: -1110 -90
position factor: -1110 -90 0
position inter final: -1110 -90 0
position inter factor: -1480 -120 0
position inter: -1110 -90 0
mouse: 2042 166
position factor: 2042 166 0
position inter final: 2042 166 0
position inter factor: 2723 221 0
position inter: 2042 166 0
я уже нихуя не помню как я че там делал, там говнокодище ужаснейшее))
InverseResolutionScale это 1080 / screen_height (это для умножения. можешь просто делить на обратное)
Пожалуйста, авторизуйтесь для просмотра ссылки.
" The exact formula for the scaling is based on the ratio of the current vertical resolution compared to 1080 pixels. "
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
326
Реакции[?]
24
Поинты[?]
12K
После патча индекс BSetProperty слетел на 305, и кстати у меня какогогт фига панелька не там рисуется. Раньше всё норм было:


C++:
                        if (!WorldToScreen(&pos, &x, &y))
                        {
                            continue;
                        }
                        x = ((x / g_MainHud->GetWidth()) * SystemWidth) - 55;

                        y = ((y / g_MainHud->GetHeight()) * SystemHeight) - 34;
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
326
Реакции[?]
24
Поинты[?]
12K
nevermind, эти дауны свапнули местами две функи в вмтшке. выяснил это спустя 30 минут блокнотом и калькулятором со школы.
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
326
Реакции[?]
24
Поинты[?]
12K
C++:
void CPanel2D__OnMouseMove( CPanel2D* rcx, float flMouseX, float flMouseY ) {
    // for dragging
    if ( rcx == panorama_gui.main_panel->panel2d_as( ) && panorama_gui.is_menu_dragging ) {
        const auto style_format{ std::format( "position: {}px {}px 0;", flMouseX, flMouseY ) };
        panorama_gui.main_panel->set_style( style_format );

        std::cout << "mouse: " << flMouseX << " " << flMouseY << std::endl;
        auto panel_style = panorama_gui.main_panel->panel_style( );
        CUILength x, y, z;
        panel_style->GetPosition( x, y, z, false );
        std::cout << std::format("position factor: {} {} {}", x.GetValue( ), y.GetValue( ), z.GetValue( ) ) << std::endl;
        panel_style->GetInterpolatedPosition( x, y, z, true, false );
        std::cout << std::format("position inter final: {} {} {}", x.GetValue( ), y.GetValue( ), z.GetValue( ) ) << std::endl;
        panel_style->GetInterpolatedPosition( x, y, z, false );
        std::cout << std::format("position inter factor: {} {} {}", x.GetValue( ), y.GetValue( ), z.GetValue( ) ) << std::endl;
        panel_style->GetInterpolatedPosition( x, y, z, false, false );
        std::cout << std::format("position inter: {} {} {}", x.GetValue( ), y.GetValue( ), z.GetValue( ) ) << std::endl;
    }

    reinterpret_cast<decltype( &CPanel2D__OnMouseMove )>( panorama_gui.origCPanel2D__OnMouseMove )( rcx, flMouseX, flMouseY );
}
Этот OnMouseMove вызывается каждую секунду, или только тогда как наводишь мышкой на свою панельку?
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
326
Реакции[?]
24
Поинты[?]
12K
Я создал кнопку тыкаю на неё и мой брекпоинт OnMouseDown не работает ( а на другие панельки работает ).
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
674
Реакции[?]
106
Поинты[?]
69K
Этот OnMouseMove вызывается каждую секунду, или только тогда как наводишь мышкой на свою панельку?
вызывается каждую,но у меня проверка только на свою
Я создал кнопку тыкаю на неё и мой брекпоинт OnMouseDown не работает ( а на другие панельки работает ).
покажи код
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
326
Реакции[?]
24
Поинты[?]
12K
вызывается каждую,но у меня проверка только на свою

покажи код
C++:
CUIPanel* OnMouseDown(CUIPanel* rcx)
    {
        for (const auto& obj : g_panels)
        {
            if(rcx == obj)
            {
              Console("Called Here\n");
             }

        }
        return oMouseDown(rcx);
    }


auto k_button = g_PanoramaEngineSource->GetButtonType(); // returns k_Symbol for "Button"
auto testButton = g_PanoramaEngineSource->CreatePanel(k_button, "testbutton", g_MainHud);

HookVMT(*(uintptr_t*)testButton,15,OnMouseDown,&oMouseDown);
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
674
Реакции[?]
106
Поинты[?]
69K
C++:
CUIPanel* OnMouseDown(CUIPanel* rcx)
    {
        for (const auto& obj : g_panels)
        {
            if(rcx == obj)
            {
              Console("Called Here\n");
             }

        }
        return oMouseDown(rcx);
    }


auto k_button = g_PanoramaEngineSource->GetButtonType(); // returns k_Symbol for "Button"
auto testButton = g_PanoramaEngineSource->CreatePanel(k_button, "testbutton", g_MainH


HookVMT(*(uintptr_t*)testButton,15,OnMouseDown,&oMouseDown);
во первых там панель2д, а не uipanel я же кидал код
C++:
bool CPanel2D__OnMouseButtonDown( CPanel2D* rcx, const MouseData_t& code ) {
    if ( panorama_gui.menu_status ) {
        if ( code.m_mouse_code == MouseCode::MOUSE_LEFT ) {
            if ( rcx == panorama_gui.camera_fog_checkbox->panel2d_as( ) ) {
                features::camera_hack.toggle_fog( );
                panorama_gui.fog_enabled ^= true;
            }
            else if ( rcx == panorama_gui.changer_add_item_button->panel2d_as( ) ) {
                ChangerAddItemButton_Handler( );
            }
            else if ( rcx == panorama_gui.visuals_manabar->panel2d_as( ) ) {
                VisualsManabarButton_Handler( );
            }
            else if ( rcx == panorama_gui.visuals_hpnumb->panel2d_as( ) )
                panorama_gui.draw_health ^= true;
            else if ( rcx == panorama_gui.misc_log_searching_players->panel2d_as( ) )
                panorama_gui.log_searching_players ^= true;
            else if ( rcx == panorama_gui.misc_autoaccept->panel2d_as( ) )
                panorama_gui.auto_accept ^= true;
            else if ( rcx == panorama_gui.camera_draw_button->panel2d_as( ) )
                panorama_gui.draw_particles ^= true;
            else if ( rcx == panorama_gui.misc_unlock_emoticons->panel2d_as( ) )
                ICVar::get( )[ "dota_hud_chat_enable_all_emoticons" ]->m_values.boolean ^= true;
            else if ( rcx == panorama_gui.misc_networth_delta->panel2d_as( ) ) {
                MiscGoldDisplay_Handler( );
            }
        }
    }

    return reinterpret_cast<decltype( &CPanel2D__OnMouseButtonDown )>( origCPanel2D__OnMouseButtonDown )( rcx, code );
}
а во вторых что это за массив ты итерируешь?
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
326
Реакции[?]
24
Поинты[?]
12K
return reinterpret_cast<decltype( &CPanel2D__OnMouseButtonDown )>( origCPanel2D__OnMouseButtonDown )( rcx, code );
}[/CODE]
а во вторых что это за массив ты итерируешь?
ну это личный масссив, прикол в том что я ставлю БП на вмт 15(0,1,2...15) и у меня оно срабатывает в основном только на дотовских. OnMouseButtonDown работает только на CPanel2D::CButton (<CButton/>) или работает также на CPanel2D (<Panel/>) ?
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
326
Реакции[?]
24
Поинты[?]
12K
C++:
struct Handler
{
void* panel2d;
void* func;
};

void TestMessage()
{
Console("Hello");
}

 

class UIEngineSource2
{
public:
...
virtual void* RegisterEventHandler(WORD k_type,CUIPanel*,Handler*);// 40 VMT; #STR: "CUIEngine::RegisterEventHandler"
};
 





auto k_mousedown = g_PanoramaEngineSource->GetTypeForSymbol("onmousedown"); // returns 5029

auto helperPanelButton = g_PanoramaEngineSource->CreatePanel(k_button, "helperbutton", g_MainHud); // k_button is 4921


        Handler test;
        test.func = &TestMessage;
        test.panel = helperPanelButton;

        g_PanoramaEngineSource->RegisterEventHandler(k_mouseover, helperPanelButton->panelUI, &test);

Все равно не работает нихера,бпшка не срабатывает когда жмякаю на кнопку
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
326
Реакции[?]
24
Поинты[?]
12K
Вобщем замутил фичу самым даунским способом:
1) хуком онмаусдаун и онмаусап и добавил в свой клас панелек флаг "Другинг".Добавил рандомную кнопку чисто кнопку CButton и когда на неё тыкаю то срабатывает хук онмаусдаун а на самотыкание на панельки ничё не дает (как Liberalist собственно говорил). и тупо когда я жму на эту кнопку то оно меняет позицию панельки этой кнопки и + позицию панельки моей итемпанели. Ты говорил что нужно добавить ко всем панелькам кнопку и установить width:100%, height:100% ноесли я так сделаю то моей панельки вообще нихера не будет видно. А просто сама кнопка.

был бы очень благодарен если есть способ как то ловить хук на нажатие на саму панель а не на кнопку, просто моя итемпанель существует в основном из панели класса CPanel2D (а не CButton, etc. )
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
Вобщем замутил фичу самым даунским способом:
1) хуком онмаусдаун и онмаусап и добавил в свой клас панелек флаг "Другинг".Добавил рандомную кнопку чисто кнопку CButton и когда на неё тыкаю то срабатывает хук онмаусдаун а на самотыкание на панельки ничё не дает (как Liberalist собственно говорил). и тупо когда я жму на эту кнопку то оно меняет позицию панельки этой кнопки и + позицию панельки моей итемпанели. Ты говорил что нужно добавить ко всем панелькам кнопку и установить width:100%, height:100% ноесли я так сделаю то моей панельки вообще нихера не будет видно. А просто сама кнопка.

был бы очень благодарен если есть способ как то ловить хук на нажатие на саму панель а не на кнопку, просто моя итемпанель существует в основном из панели класса CPanel2D (а не CButton, etc. )
Пожалуйста, авторизуйтесь для просмотра ссылки.
hittest аттрибут попробуй true на панельку поставь и посмотри
 
Сверху Снизу