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

Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
851
Реакции[?]
335
Поинты[?]
67K
Liberalist ты не в курсе где найти onhover? или это и есть OnMouseMove ? Посмотреть вложение 282623
я уже не помню как я делал но как минимум там есть виртуальный метод CUIPanel::BHasHoverStyle(179 индекс щас функа есть она возвращает все флаги(styleflags в панорама дебаггере которые показывает), там LSB(flags & 1) это ховер флаг) можешь каждый кадр чекать у своих панелей и делать чтото потом на основании этого(возможно hittest true нужен для этого хз я не помню)
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
692
Реакции[?]
110
Поинты[?]
73K
был бы очень благодарен если есть способ как то ловить хук на нажатие на саму панель а не на кнопку, просто моя итемпанель существует в основном из панели класса CPanel2D (а не CButton, etc. )
всмысле? кнопка это и есть панель(cbutton наследуется от cpanel2d) и в onmousebuttondown как раз может передаватся и обычная cpanel2d и cdropdown и cbutton и cslider(еще раз напоминаю они все наследуются от панель2д)
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
355
Реакции[?]
24
Поинты[?]
12K
всмысле? кнопка это и есть панель(cbutton наследуется от cpanel2d) и в onmousebuttondown как раз может передаватся и обычная cpanel2d и cdropdown и cbutton и cslider(еще раз напоминаю они все наследуются от панель2д)
хрен знает, поставил БП на Onmousedown и жму на панель ( CPanel2D ) и ничего не происходит. Когда кликаю на кнопку ( class CButton : CPanel2D) то бп работает. Сам либералист об этом говорил:
1722890418818.png
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
851
Реакции[?]
335
Поинты[?]
67K
хрен знает, поставил БП на Onmousedown и жму на панель ( CPanel2D ) и ничего не происходит. Когда кликаю на кнопку ( class CButton : CPanel2D) то бп работает. Сам либералист об этом говорил:
Посмотреть вложение 282793
я конеш не особо копался(в частности своих панелей не создавал а с дотовскими тестил) но
1) хиттест=тру обязателен(возможно он и так по дефолту тру(и следовательно его не надо ставить т.к. он и так уже по дефолту стоит) я не тестил, но я тестил что с фалсом точно не будет работать)
2) онмауздаун срабатывает на самом дочернем элементе(ну логично, если кнопка внутри панели то на кнопку клик будет а не на панель которая её содержит)
3) онмауздаун срабатывает на <Panel>(например на консоль если на заголовок кликнуть(Header айди панели), или у консоли тоже ResizeDragTarget) но ток не совсем понял при каких условиях(ну скорее всего когда внутри нет элементов которые бы воровали онмауздаун)(хотя вроде я так понимаю есть еще случаи когда родитель может воровать онмауздаун у дочерней панели - например скроллбары в консоли - <HorizontalScrollBar> хендлит онмауздаун а до дочерней панели не доходит)
хз кароче надо больше тестить и особенно со своими собственными панелями но мне лень
ну и еще пример того как бп на CPanel2D срабатывает - кнопки(они не кнопки а панели на самом деле) в главном меню акт1 акт2 акт3 которые акты краунфолла переключают
скинь код(протестить со своими панелями) для создания панелей и всё такое все индексы и тд мне лень искать
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
355
Реакции[?]
24
Поинты[?]
12K
я конеш не особо копался(в частности своих панелей не создавал а с дотовскими тестил) но
1) хиттест=тру обязателен(возможно он и так по дефолту тру(и следовательно его не надо ставить т.к. он и так уже по дефолту стоит) я не тестил, но я тестил что с фалсом точно не будет работать)
2) онмауздаун срабатывает на самом дочернем элементе(ну логично, если кнопка внутри панели то на кнопку клик будет а не на панель которая её содержит)
3) онмауздаун срабатывает на <Panel>(например на консоль если на заголовок кликнуть(Header айди панели), или у консоли тоже ResizeDragTarget) но ток не совсем понял при каких условиях(ну скорее всего когда внутри нет элементов которые бы воровали онмауздаун)(хотя вроде я так понимаю есть еще случаи когда родитель может воровать онмауздаун у дочерней панели - например скроллбары в консоли - <HorizontalScrollBar> хендлит онмауздаун а до дочерней панели не доходит)
хз кароче надо больше тестить и особенно со своими собственными панелями но мне лень
ну и еще пример того как бп на CPanel2D срабатывает - кнопки(они не кнопки а панели на самом деле) в главном меню акт1 акт2 акт3 которые акты краунфолла переключают
скинь код(протестить со своими панелями) для создания панелей и всё такое все индексы и тд мне лень искать
эх скинуть код не выйдет ибо послушал тебя и начал делать рефакторизацию XDD и фиксить. Мне чтобы сделать просчет кд способки типа AbilityCD = (Enemy->LastSeenTime - GetGameTime()) пришлось переписовать 70% своего файла с логикой ибо у меня очень плохо было ))
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
355
Реакции[?]
24
Поинты[?]
12K
я два с половиной часа ебался не мог понять почему у меня bsetproperty нихера не делает, а оказывается есть разница между GetSymbol("style") и GetSymbol("Style")
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
851
Реакции[?]
335
Поинты[?]
67K
я два с половиной часа ебался не мог понять почему у меня bsetproperty нихера не делает, а оказывается есть разница между GetSymbol("style") и GetSymbol("Style")
GetSymbol просто возвращает индекс строки в "таблице символов"(это две таблицы одна из которых содержит строки друг за другом а вторая содержит оффсеты к строкам в первой таблице)
грубо говоря GetSymbol идентифицирует строку.
в самом хтмл style и StYlE одно и то же по стандарту но видимо вальвам похуй и у них кейс-сенситив имена, так что учитывай это(соответствено тоже надо юзать Panel а не panel и т.д.)
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
355
Реакции[?]
24
Поинты[?]
12K
Кстати есть какой-то простенький способ перемещать панельку а не юзать виндовское апи? я смотрел на isdraggable setdraggable но чето херовенько работает. я созда лпанельку типа DragPanel вродебы как то но проблема что я его подсоеднил к своей основной панельки и я токог вниз верх перемещать как линию
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
851
Реакции[?]
335
Поинты[?]
67K
Кстати есть какой-то простенький способ перемещать панельку а не юзать виндовское апи? я смотрел на isdraggable setdraggable но чето херовенько работает. я созда лпанельку типа DragPanel вродебы как то но проблема что я его подсоеднил к своей основной панельки и я токог вниз верх перемещать как линию
не знаю. на крайняк руками драг можешь сделать(онмауздаун драг=тру, онмаузап драг=фалс, онмаузмув иф драг: позишн += (курсорпоз - олд_курсорпоз))
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
355
Реакции[?]
24
Поинты[?]
12K
Почему не работает SetProperty(k_text, value) к новосозданной панельки типа Label ?

Оно создает почему то аттрибут не в том месте, или я не совсем понял как это правильно сделать. У нормального есть свое значение text в котором лежит текст ) а у меня создает аттрибут отдельный который нихера не делает.



C++:
void CPanel2D::SetPropertyInternal(short code, const char* value)
{
    CProperty property(code, value);
    return SetProperty(&property);
}
void CPanel2D::SetProperty(const char* property, const char* value)
{
    auto _value = GetSymbol(property);
    return SetPropertyInternal(_value, value);
}

label = (CLabel*)UIENGINESOURCE->CreatePanel(value, "XXXPanel_text", Dashboard->IUPanel);
label->SetProperty("text", "this is text"); //// xref BSETPROPERTY
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
851
Реакции[?]
335
Поинты[?]
67K
Почему не работает SetProperty(k_text, value) к новосозданной панельки типа Label ?

Оно создает почему то аттрибут не в том месте, или я не совсем понял как это правильно сделать. У нормального есть свое значение text в котором лежит текст ) а у меня создает аттрибут отдельный который нихера не делает.



C++:
void CPanel2D::SetPropertyInternal(short code, const char* value)
{
    CProperty property(code, value);
    return SetProperty(&property);
}
void CPanel2D::SetProperty(const char* property, const char* value)
{
    auto _value = GetSymbol(property);
    return SetPropertyInternal(_value, value);
}

label = (CLabel*)UIENGINESOURCE->CreatePanel(value, "XXXPanel_text", Dashboard->IUPanel);
label->SetProperty("text", "this is text"); //// xref BSETPROPERTY
предполагаю что text не является аттрибутом панели(ну т.е. это не чтото общее что есть у всех типа style например) и это CLabel-специфичное поле которое в панорама дебаггере просто для удобства и в захардкоженном порядке показывается как "text". юзай CLabel::SetText
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
355
Реакции[?]
24
Поинты[?]
12K
предполагаю что text не является аттрибутом панели(ну т.е. это не чтото общее что есть у всех типа style например) и это CLabel-специфичное поле которое в панорама дебаггере просто для удобства и в захардкоженном порядке показывается как "text". юзай CLabel::SetText
vmt cpanel2d 0x280/8
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
355
Реакции[?]
24
Поинты[?]
12K
а возможно ли дампить такие штуки как например panorama::MouseData_t я вроде пробовал енумом но ничего не находит
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
851
Реакции[?]
335
Поинты[?]
67K
а возможно ли дампить такие штуки как например panorama::MouseData_t я вроде пробовал енумом но ничего не находит
рефлексия(инфа об именах оффсетах переменных и тд) обычно для автоматизированной сериализации/десериализации используется("упаковка"/"распаковка" структур для передачи по сети или сохранения на диск или еще кудато). всё что с этим абсолютно никак не связано ты не сдампишь просто потому что такие вещи не нуждаются в рефлексии и инфа о них никуда не сохраняется/не экспортируется потому что она никому не нужна(ну точнее все кому она нужна итак уже эту инфу знают еще на стадии компиляции и нет смысла ее абстрактно/динамически описывать дополнительно)
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
355
Реакции[?]
24
Поинты[?]
12K
бля как итерировать список панелей внутри UIEngineSource там какие-то непонятные типа аррея

C++:
struct PanelIdentity
{
unsigned long long unk; //0x0000
unsigned long long unk0; //0x0008
CUIPanel* object; //0x0010
unsigned int indexunk; //0x0018
unsigned int pad; //0x001C
};


PanelIdentity* PanelList; //0x0130
char pad_0138[8]; //0x0138
int unk; //0x0140
int unkk; //0x0144
int unkkk; //0x0148
int Count; //0x014C
ловлю крашв любой момент изза чтения неверного указателя.
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
851
Реакции[?]
335
Поинты[?]
67K
бля как итерировать список панелей внутри UIEngineSource там какие-то непонятные типа аррея

C++:
struct PanelIdentity
{
unsigned long long unk; //0x0000
unsigned long long unk0; //0x0008
CUIPanel* object; //0x0010
unsigned int indexunk; //0x0018
unsigned int pad; //0x001C
};


PanelIdentity* PanelList; //0x0130
char pad_0138[8]; //0x0138
int unk; //0x0140
int unkk; //0x0144
int unkkk; //0x0148
int Count; //0x014C
ловлю крашв любой момент изза чтения неверного указателя.
топлевел окна(дешборд, консоль, худ и тд) содержат (несколько) топлевел панелей а у них уже дети и тд
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
355
Реакции[?]
24
Поинты[?]
12K
топлевел окна(дешборд, консоль, худ и тд) содержат (несколько) топлевел панелей а у них уже дети и тд
а есть ли способ как то итерировать через тот указатель на 0х130 ? проблема в том что я не знаю какое значение имеет кол-во елементов (size)
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
851
Реакции[?]
335
Поинты[?]
67K
а есть ли способ как то итерировать через тот указатель на 0х130 ? проблема в том что я не знаю какое значение имеет кол-во елементов (size)
в таких ситуациях когда размер не понятен хвбп ставь и смотри как сама игра итерирует. она же откудато берет инфу о конце/размере. если она вообще итерирует конечно.
 
Сверху Снизу