Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
13 Jul 2017, 19:37
Сообщение
#361
|
|
|
Power Member Сообщений: 198 Спасибо сказали: 134 раза |
|
|
|
|
17 Aug 2017, 17:49
Сообщение
#362
|
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз |
В комменте /* рабочий код */. Подключил homm3.h. Переписал. Вопрос почему hero->second_skill[HSS_FIRE_MAGIC] не возвращает уровень Магии Огня (см. код)?
Код int __stdcall blindSpell(LoHook* h, HookContext* c)
{ if ( c->ebx == SPL_BLIND ) { /* int cmAddr = *(int*)0x699420; int monSide = *(int*)(c->esi + 244); int heroOffset = *(int*)(cmAddr + (1 - monSide) * 4 + 0x53CC); // Адрес вражеского героя int duration[] = {1, 1, 3, 5}; if ( heroOffset ) c->eax = duration[*(char*)(heroOffset + 201 + 14)]; */ int duration[] = {1, 1, 3, 5}; _BattleStack_* battleStack = (_BattleStack_*)c->esi; _Hero_* hero = o_BattleMgr->hero[1 - battleStack->side]; // if ( hero ) c->eax = duration[hero->second_skill[HSS_FIRE_MAGIC]]; // Почему это не работает? if ( hero ) c->eax = duration[*(char*)((int)hero + 201 + 14)]; // А это работает } return EXEC_DEFAULT; } |
|
|
|
17 Aug 2017, 19:28
Сообщение
#363
|
|
![]() laughed as one fey Сообщений: 12 167 Спасибо сказали: 20605 раз |
Попробуй потыкать компилятор носом в алигны
|
|
|
|
17 Aug 2017, 19:33
(Сообщение отредактировал AlexSpl - 17 Aug 2017, 19:34)
Сообщение
#364
|
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз |
Раскомментировал обе строки. Запустил отладчик:
![]() Что за фигня? Откуда в первом случае смещение 0E6h? Цитата Попробуй потыкать компилятор носом в алигны Да. Так работает. Спасибо. |
|
|
|
19 Aug 2017, 08:54
Сообщение
#365
|
|
|
Power Member Сообщений: 198 Спасибо сказали: 134 раза |
Добрый день. Нет ли у кого-то кастомного диалога, который подходит для простой задачи - выбрать число из некоего ряда (скажем, ряд из 9 чисел)с помощью ползунка (как, например, в диалоге разделения отрядов) ? Картинки не требуются, только заголовок для диалога. P.S. Речь идет о программировании с помощью HD мода. |
|
|
|
19 Aug 2017, 22:26
Сообщение
#366
|
|
![]() допустим, мяў Сообщений: 24 129 Спасибо сказали: 13439 раз |
О, чувствую, скоро появится библиотека VCL для плагинов к HD-mod. ))
-------------------- Вокруг столько фильмов, книг, музыки - а природа какая невероятная!
Если тебе скучно жить - ты совсем дурак. (Татьяна Черниговская) |
|
|
|
20 Aug 2017, 16:06
Сообщение
#367
|
|
![]() Immortal Сообщений: 589 Спасибо сказали: 891 раз |
Нет ли у кого-то кастомного диалога, который подходит для простой задачи - выбрать число из некоего ряда (скажем, ряд из 9 чисел)с помощью ползунка (как, например, в диалоге разделения отрядов) ? Как-то так... ![]() Код void __fastcall Scroll_TestDlg_Callback(int klick_id, _Dlg_* dlg) { klick_id ? dlg->GetItem(30722)->SetEnabled(1) : dlg->GetItem(30722)->SetEnabled(0); // включить или выключить кнопку ок dlg->Redraw(TRUE); } void New_TestDlg_Show(int x, int y) { _Dlg_* dlg = _CustomDlg_::Create(-1, -1, 297, 215, DF_SCREENSHOT | DF_SHADOW, NULL); // создали диалог dlg->AddItemByZOrder(_DlgStdBackground_::Create(0, 0, dlg->width, dlg->height, 0, 0, o_GameMgr->GetMeID()), 0); // рамка в цвете игрока dlg->AddItem(_DlgStaticText_::Create(0, 20, dlg->width, 30, "Переместить ползунок?", "bigfont.fnt", 7, 1, ALIGN_H_CENTER | ALIGN_V_TOP, 0)); // заголовок dlg->AddItem(_DlgStaticText_::Create(0, 60, dlg->width, 50, "Вы можете перемещать ползунок, \n и вправо, и влево!", "medfont.fnt", 1, 0, ALIGN_H_CENTER | ALIGN_V_TOP, 0)); // описание dlg->AddItem(_DlgScroll_::Create(30, dlg->height -85, 234, 16, 40, 9, (_ptr_)Scroll_TestDlg_Callback, 0, 18, 0)); // создать ползунок // делаем кнопку ок dlg->AddItem(_DlgStaticPcx8_::Create(19, dlg->height -52, 0, "Box64x30.pcx")); dlg->AddItem(_DlgButton_::Create(20, dlg->height -51, 64, 30, 30722, "iOkay.def", 0, 1, 1, 28, 2)); dlg->GetItem(30722)->SetEnabled(0); // отключенная кнопка ok // делаем кнопку отмена dlg->AddItem(_DlgStaticPcx8_::Create(213, dlg->height -52, 0, "Box64x30.pcx")); dlg->AddItem(_DlgButton_::Create(214, dlg->height -51, 64, 30, 30721, "iCancel.def", 0, 1, 1, 1, 2)); // b_MouseMan_SetCursor(0,0); CALL_3 (void, __thiscall, 0x50CEA0, o_MouseMgr, 0, 0); // установить курсор(0,0) dlg->Run(); dlg->Destroy(TRUE); } -------------------- |
|
|
|
20 Aug 2017, 18:40
Сообщение
#368
|
|
|
Power Member Сообщений: 198 Спасибо сказали: 134 раза |
А какой в данном случае ряд чисел ? И как сделать так, чтобы при движении ползунка число отображалось в некоем поле ?
|
|
|
|
21 Aug 2017, 11:17
(Сообщение отредактировал igrik - 22 Aug 2017, 10:42)
Сообщение
#369
|
|
![]() Immortal Сообщений: 589 Спасибо сказали: 891 раз |
А какой в данном случае ряд чисел ? И как сделать так, чтобы при движении ползунка число отображалось в некоем поле ? Вот так. ![]() ![]() Код void __fastcall Scroll_TestDlg_Callback(int klick_id, _Dlg_* dlg) { klick_id ? dlg->GetItem(30722)->SetEnabled(1) : dlg->GetItem(30722)->SetEnabled(0); // включить или выключить кнопку ок sprintf(o_TextBuffer, "%d", klick_id); ((_DlgStaticText_*)dlg->GetItem(14))->SetText(o_TextBuffer); // ((_DlgStaticText_*)dlg->GetItem(14))->SetText(va_cstr("%d", klick_id)); // id текста = 14 dlg->Redraw(TRUE); } void New_TestDlg_Show(int x, int y) { _Dlg_* dlg = _CustomDlg_::Create(-1, -1, 297, 215, DF_SCREENSHOT | DF_SHADOW, NULL); // создали диалог dlg->AddItemByZOrder(_DlgStdBackground_::Create(0, 0, dlg->width, dlg->height, 0, 0, o_GameMgr->GetMeID()), 0); // рамка в цвете игрока dlg->AddItem(_DlgStaticText_::Create(0, 20, dlg->width, 30, "Переместить ползунок?", "bigfont.fnt", 7, 1, ALIGN_H_CENTER | ALIGN_V_TOP, 0)); // заголовок dlg->AddItem(_DlgStaticText_::Create(0, 60, dlg->width, 50, "Вы можете перемещать ползунок, \n и вправо, и влево!", "medfont.fnt", 1, 0, ALIGN_H_CENTER | ALIGN_V_TOP, 0)); // описание dlg->AddItem(_DlgScroll_::Create(30, dlg->height -85, 234, 16, 40, 9, (_ptr_)Scroll_TestDlg_Callback, 0, 18, 0)); // создать ползунок // создаем отображенное число, зависимое от ползунка в поле dlg->AddItem(_DlgStaticText_::Create(137, dlg->height -52, 30, 30, "0", "medfont.fnt", 1, 14, ALIGN_H_CENTER | ALIGN_V_CENTER, 0)); // id текста = 14 // делаем кнопку ок dlg->AddItem(_DlgStaticPcx8_::Create(19, dlg->height -52, 0, "Box64x30.pcx")); dlg->AddItem(_DlgButton_::Create(20, dlg->height -51, 64, 30, 30722, "iOkay.def", 0, 1, 1, 28, 2)); dlg->GetItem(30722)->SetEnabled(0); // отключенная кнопка ok // делаем кнопку отмена dlg->AddItem(_DlgStaticPcx8_::Create(213, dlg->height -52, 0, "Box64x30.pcx")); dlg->AddItem(_DlgButton_::Create(214, dlg->height -51, 64, 30, 30721, "iCancel.def", 0, 1, 1, 1, 2)); // b_MouseMan_SetCursor(0,0); CALL_3 (void, __thiscall, 0x50CEA0, o_MouseMgr, 0, 0); // установить курсор(0,0) dlg->Run(); dlg->Destroy(TRUE); } Ряд чисел 0...9. Указан в int ticks_count: dlg->AddItem(_DlgScroll_::Create(30, dlg->height -85, 234, 16, 40, 9, (_ptr_)Scroll_TestDlg_Callback, 0, 18, 0)); // создать ползунок PS: Но я не задавался целью сделать красивый диалог -------------------- |
|
|
|
21 Aug 2017, 13:54
Сообщение
#370
|
|
![]() laughed as one fey Сообщений: 12 167 Спасибо сказали: 20605 раз |
Ня.
Тоже, что ли, диалоги потыкать. |
|
|
|
26 Aug 2017, 17:49
(Сообщение отредактировал AlexSpl - 26 Aug 2017, 18:01)
Сообщение
#371
|
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз |
2igrik: Компилируется нормально, но компоновщик выдаёт ошибки типа таких:
Полный код dllmain.cpp такой: Кто знает, что ему нужно? Как будто отсутствует определение конструктора. Хедеры лежат в папке с dllmain. |
|
|
|
27 Aug 2017, 21:55
(Сообщение отредактировал AlexSpl - 27 Aug 2017, 22:04)
Сообщение
#372
|
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз |
2igrik: DLL получилась. Спасибо. Только как теперь этот диалог потестить? Например, в хуке он не работает (игра крашится). Стандартные диалоги работают.
|
|
|
|
28 Aug 2017, 00:41
(Сообщение отредактировал AlexSpl - 28 Aug 2017, 03:19)
Сообщение
#373
|
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз |
Вот так заработало (без AddItemByZOrder и, соответственно, без фона):
Код void New_TestDlg_Show(int x, int y) { _Dlg_* dlg = _CustomDlg_::Create(-1, -1, 297, 215, DF_SCREENSHOT | DF_SHADOW, NULL); // создали диалог // dlg->AddItemByZOrder(_DlgStdBackground_::Create(0, 0, dlg->width, dlg->height, 0, 0, o_GameMgr->GetMeID()), 0); // рамка в цвете игрока dlg->AddItem(_DlgStaticText_::Create(0, 20, dlg->width, 30, "Переместить ползунок?", "bigfont.fnt", 7, 1, ALIGN_H_CENTER | ALIGN_V_TOP, 0)); // заголовок dlg->AddItem(_DlgStaticText_::Create(0, 60, dlg->width, 50, "Вы можете перемещать ползунок, \n и вправо, и влево!", "medfont.fnt", 1, 0, ALIGN_H_CENTER | ALIGN_V_TOP, 0)); // описание dlg->AddItem(_DlgScroll_::Create(30, dlg->height -85, 234, 16, 40, 9, (_ptr_)Scroll_TestDlg_Callback, 0, 18, 0)); // создать ползунок // создаем отображенное число, зависимое от ползунка в поле dlg->AddItem(_DlgStaticText_::Create(137, dlg->height -52, 30, 30, "0", "medfont.fnt", 1, 14, ALIGN_H_CENTER | ALIGN_V_CENTER, 0)); // id текста = 14 // делаем кнопку ок dlg->AddItem(_DlgStaticPcx8_::Create(19, dlg->height -52, 0, "Box64x30.pcx")); dlg->AddItem(_DlgButton_::Create(20, dlg->height -51, 64, 30, 30722, "iOkay.def", 0, 1, 1, 28, 2)); dlg->GetItem(30722)->SetEnabled(0); // отключенная кнопка ok // делаем кнопку отмена dlg->AddItem(_DlgStaticPcx8_::Create(213, dlg->height -52, 0, "Box64x30.pcx")); dlg->AddItem(_DlgButton_::Create(214, dlg->height -51, 64, 30, 30721, "iCancel.def", 0, 1, 1, 1, 2)); // b_MouseMan_SetCursor(0,0); CALL_3(void, __thiscall, 0x50CEA0, o_MouseMgr, 0, 0); // установить курсор(0,0) dlg->SetPos(x, y); // Задаём координаты левого верхнего угла диалога dlg->Run(); dlg->Destroy(TRUE); } С фоном игра либо крашится, либо зависает. Посмотрел реализацию метода _DlgStdBackground_::Create() - там вложенные бесконечные циклы while ( true ). У тебя, igrik, на скринах всё в порядке. Интересно, почему у меня фон не хочет отрисовываться. * * * Поэкспериментировал с координатами: ![]() Это картинка _DlgStdBackground_::Create(20, 20, 200, 200, 0, 0, o_GameMgr->GetMeID()). После боя всё равно вылетает. |
|
|
|
28 Aug 2017, 08:33
(Сообщение отредактировал igrik - 28 Aug 2017, 14:03)
Сообщение
#374
|
|
![]() Immortal Сообщений: 589 Спасибо сказали: 891 раз |
У тебя, igrik, на скринах всё в порядке. Интересно, почему у меня фон не хочет отрисовываться. Изначально я обычно всё проверяю на Эре. Так вот, в Эре этих проблем нет - окно нормально отображается с задником (откуда и были скрины). Чего не скажешь про SoD/HotA. Что ж .... будем разбираться. PS: тебе обязательно нужны динамически изменяемые размеры окна, или ты будешь использовать статический размер? Код _DlgStaticPcx8_* backPcx; dlg->AddItem(backPcx = b_DlgStaticPcx8_Create(0, 0, dlg->width, dlg->height, 1, "Фоновый_Рисунок.pcx", 2048)); backPcx->Colorize(o_GameMgr->GetMeID()); ========================== UPD: [решено!!] Код // создание подложки под цвет игрока
void Set_DlgStdBackground(_Dlg_* dlg) { CALL_5 (int, __thiscall, 0x48FA80, dlg, dlg->x, dlg->y, dlg->width, dlg->height); for (int i = dlg->field_4C; i <= dlg->field_50; ++i) { CALL_5 (int, __thiscall, 0x5FF400, dlg, 512, 13, i, o_GameMgr->GetMeID()); } } void New_TestDlg_Show(int x, int y) { _Dlg_* dlg = _CustomDlg_::Create(-1, -1, 297, 155, DF_SCREENSHOT | DF_SHADOW, NULL); Set_DlgStdBackground(dlg); // создание подложки ... -------------------- |
|
|
|
28 Aug 2017, 18:28
(Сообщение отредактировал AlexSpl - 28 Aug 2017, 19:07)
Сообщение
#375
|
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз |
Да, так работает. Хоть я не знаю, что такое поля field_4C и т.п. Ещё раз спасибо!
Вот такая красота получилась:
|
|
|
|
28 Aug 2017, 20:02
(Сообщение отредактировал igrik - 28 Aug 2017, 20:03)
Сообщение
#376
|
|
![]() Immortal Сообщений: 589 Спасибо сказали: 891 раз |
Хоть я не знаю, что такое поля field_4C и т.п. Ещё раз спасибо! Я сам точно не знаю, но судя по реверсу field_4C и field_50 это границы id элементов фона, как раз для перекраски последнего в цвет игрока.Ведь такой фон диалогового окна зачастую строится путем склеивания кадров из дефа. -------------------- |
|
|
|
28 Aug 2017, 21:40
(Сообщение отредактировал AlexSpl - 28 Aug 2017, 22:31)
Сообщение
#377
|
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз |
Как получить значение (в данном случае последнее click_id) из колбэка, не прибегая к глобальным переменным?
btw, есть у этого скролла в примере недостаток: если кликать прямо по полосе прокрутки, ползунок будет перемещаться с максимальным шагом. Например, для диапазона значений от 1 до 10, если ползунок стоял на 1, то при клике в любом свободном от него месте полосы прокрутки, он переместится сразу в положение 10. UPD: Нашёл, как исправить (частично): Код // Добавляем полосу горизонтальной прокрутки dlg->AddItem(_DlgScroll_::Create(30, dlg->height - 90, dlg->width - 30 * 2 + 1, 16, 40, count, (_ptr_)scrollDlgCallback, 0, 1, 0)); Предпоследний аргумент - это шаг при клике по полосе прокрутки. В идеале нужно, наверное, с координатами мыши работать. В диалоге разделения отрядов полоса прокрутки работает привычно: где кликнул, там ползунок и очутился |
|
|
|
28 Aug 2017, 22:31
Сообщение
#378
|
|
![]() Immortal Сообщений: 589 Спасибо сказали: 891 раз |
Как получить значение (в данном случае последнее click_id) из колбэка, не прибегая к глобальным переменным? Вот кстати не могу точно ответить на этот вопрос. Но я использовал dlg->field_64, хоть и не знаю используется оно где-то или нет.
-------------------- |
|
|
|
28 Aug 2017, 23:03
(Сообщение отредактировал AlexSpl - 28 Aug 2017, 23:35)
Сообщение
#379
|
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз |
Последний аргумент, скорее всего, что-то типа TabOrder. Если его поставить достаточно большим (например, 20), то ползунком можно управлять с клавиатуры (стрелка влево/вправо/вверх/вниз, Page Up/Down).
А нет. Если 0 - нельзя управлять с клавиатуры, больше 0 - можно (флаг bool?). Но анимируется только нажатие левой кнопки (стрелка влево), причём с графическим глюком снизу, правая кнопка не анимируется (стрелка вправо). * * * Заметил, что если кликнуть на полосе прокрутки, а затем, удерживая левую кнопку мыши, передвинуть её на 1 пиксель, то ползунок занимает ближайшее к курсору (дискретное) положение. Как можно сымитировать такое движение мышью? |
|
|
|
02 Sep 2017, 09:19
Сообщение
#380
|
|
|
Power Member Сообщений: 198 Спасибо сказали: 134 раза |
Хотел бы довести до ума свой плагин с Городским порталом (http://forum.df2.ru/index.php?showtopic=30848&st=20),
Данный плагин дает возможность Герою на любом уровне Магии Земли выбирать город для телепортирования. Проблема в том, что компьютер не использует эту возможность (протестировано). Значит, при действиях на карте, он проверяет, есть ли у него Городской портал и какой у него уровень Магии Земли. Можно ли как-то определить участок кода, где это делается ? То есть можно ли, например, отследить обращения к данному поле в объекте Герой (Магия Земли) ? |
|
|
|
![]() ![]() |
| Текстовая версия | Сейчас: 20 December 2025 - 18:59 |
|
Copyright by Алексей Крючков
Programming by Degtyarev Dmitry |
|