IPB

Здравствуйте, гость ( Вход | Регистрация )

23 страниц V  « < 17 18 19 20 21 > »   
Reply to this topicStart new topic
> Обсуждение инженерного анализа
Ben
сообщение 13 Jul 2017, 19:37
Сообщение #361

Power Member
Сообщений: 198
Спасибо сказали: 134 раза




Цитата(feanor @ 13 Jul 2017, 15:19) *
*(int*)0x004EB816 = (int)Dependencies0;


Ну, вот это я и называю как бы изменением экзешника, только не на винчестере, а в памяти, получается.
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 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;
}
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 17 Aug 2017, 19:28
Сообщение #363

laughed as one fey
Сообщений: 12 167
Спасибо сказали: 20605 раз




Попробуй потыкать компилятор носом в алигны



Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 17 Aug 2017, 19:33 (Сообщение отредактировал AlexSpl - 17 Aug 2017, 19:34)
Сообщение #364

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Раскомментировал обе строки. Запустил отладчик:



Что за фигня? Откуда в первом случае смещение 0E6h?

Цитата
Попробуй потыкать компилятор носом в алигны

Да. Так работает. Спасибо.
Go to the top of the pageAdd Nick
 
+Quote Post
Ben
сообщение 19 Aug 2017, 08:54
Сообщение #365

Power Member
Сообщений: 198
Спасибо сказали: 134 раза





Добрый день.

Нет ли у кого-то кастомного диалога, который подходит для простой задачи -
выбрать число из некоего ряда (скажем, ряд из 9 чисел)с помощью ползунка
(как, например, в диалоге разделения отрядов) ?

Картинки не требуются, только заголовок для диалога.

P.S. Речь идет о программировании с помощью HD мода.
Go to the top of the pageAdd Nick
 
+Quote Post
hippocamus
сообщение 19 Aug 2017, 22:26
Сообщение #366

допустим, мяў
Сообщений: 24 129
Спасибо сказали: 13439 раз




О, чувствую, скоро появится библиотека VCL для плагинов к HD-mod. ))


--------------------
Вокруг столько фильмов, книг, музыки - а природа какая невероятная!
Если тебе скучно жить - ты совсем дурак. (Татьяна Черниговская)
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 20 Aug 2017, 16:06
Сообщение #367

Immortal
Сообщений: 589
Спасибо сказали: 891 раз




Цитата(Ben @ 19 Aug 2017, 08:54) *
Нет ли у кого-то кастомного диалога, который подходит для простой задачи -
выбрать число из некоего ряда (скажем, ряд из 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);
}



--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Ben
сообщение 20 Aug 2017, 18:40
Сообщение #368

Power Member
Сообщений: 198
Спасибо сказали: 134 раза




А какой в данном случае ряд чисел ? И как сделать так, чтобы при движении ползунка число отображалось в некоем поле ?
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 21 Aug 2017, 11:17 (Сообщение отредактировал igrik - 22 Aug 2017, 10:42)
Сообщение #369

Immortal
Сообщений: 589
Спасибо сказали: 891 раз




Цитата(Ben @ 20 Aug 2017, 18:40) *
А какой в данном случае ряд чисел ? И как сделать так, чтобы при движении ползунка число отображалось в некоем поле ?

Вот так.




Код
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: Но я не задавался целью сделать красивый диалог


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 21 Aug 2017, 13:54
Сообщение #370

laughed as one fey
Сообщений: 12 167
Спасибо сказали: 20605 раз




Ня.
Тоже, что ли, диалоги потыкать.
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 26 Aug 2017, 17:49 (Сообщение отредактировал AlexSpl - 26 Aug 2017, 18:01)
Сообщение #371

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




2igrik: Компилируется нормально, но компоновщик выдаёт ошибки типа таких:


Полный код dllmain.cpp такой:


Кто знает, что ему нужно? Как будто отсутствует определение конструктора. Хедеры лежат в папке с dllmain.
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 27 Aug 2017, 21:55 (Сообщение отредактировал AlexSpl - 27 Aug 2017, 22:04)
Сообщение #372

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




2igrik: DLL получилась. Спасибо. Только как теперь этот диалог потестить? Например, в хуке он не работает (игра крашится). Стандартные диалоги работают.

Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 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()). После боя всё равно вылетает.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 28 Aug 2017, 08:33 (Сообщение отредактировал igrik - 28 Aug 2017, 14:03)
Сообщение #374

Immortal
Сообщений: 589
Спасибо сказали: 891 раз




Цитата(AlexSpl @ 28 Aug 2017, 00:41) *
У тебя, 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);   // создание подложки
      
       ...


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 28 Aug 2017, 18:28 (Сообщение отредактировал AlexSpl - 28 Aug 2017, 19:07)
Сообщение #375

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Да, так работает. Хоть я не знаю, что такое поля field_4C и т.п. Ещё раз спасибо!

Вот такая красота получилась:

Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 28 Aug 2017, 20:02 (Сообщение отредактировал igrik - 28 Aug 2017, 20:03)
Сообщение #376

Immortal
Сообщений: 589
Спасибо сказали: 891 раз




Цитата(AlexSpl @ 28 Aug 2017, 18:28) *
Хоть я не знаю, что такое поля field_4C и т.п. Ещё раз спасибо!
Я сам точно не знаю, но судя по реверсу field_4C и field_50 это границы id элементов фона, как раз для перекраски последнего в цвет игрока.
Ведь такой фон диалогового окна зачастую строится путем склеивания кадров из дефа.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 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));

Предпоследний аргумент - это шаг при клике по полосе прокрутки.

В идеале нужно, наверное, с координатами мыши работать. В диалоге разделения отрядов полоса прокрутки работает привычно: где кликнул, там ползунок и очутился smile.gif
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 28 Aug 2017, 22:31
Сообщение #378

Immortal
Сообщений: 589
Спасибо сказали: 891 раз




Цитата(AlexSpl @ 28 Aug 2017, 21:40) *
Как получить значение (в данном случае последнее click_id) из колбэка, не прибегая к глобальным переменным?
Вот кстати не могу точно ответить на этот вопрос. Но я использовал dlg->field_64, хоть и не знаю используется оно где-то или нет.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 28 Aug 2017, 23:03 (Сообщение отредактировал AlexSpl - 28 Aug 2017, 23:35)
Сообщение #379

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Последний аргумент, скорее всего, что-то типа TabOrder. Если его поставить достаточно большим (например, 20), то ползунком можно управлять с клавиатуры (стрелка влево/вправо/вверх/вниз, Page Up/Down).

А нет. Если 0 - нельзя управлять с клавиатуры, больше 0 - можно (флаг bool?). Но анимируется только нажатие левой кнопки (стрелка влево), причём с графическим глюком снизу, правая кнопка не анимируется (стрелка вправо).

* * *
Заметил, что если кликнуть на полосе прокрутки, а затем, удерживая левую кнопку мыши, передвинуть её на 1 пиксель, то ползунок занимает ближайшее к курсору (дискретное) положение. Как можно сымитировать такое движение мышью?
Go to the top of the pageAdd Nick
 
+Quote Post
Ben
сообщение 02 Sep 2017, 09:19
Сообщение #380

Power Member
Сообщений: 198
Спасибо сказали: 134 раза




Хотел бы довести до ума свой плагин с Городским порталом (http://forum.df2.ru/index.php?showtopic=30848&st=20),

Данный плагин дает возможность Герою на любом уровне Магии Земли выбирать город для телепортирования.

Проблема в том, что компьютер не использует эту возможность (протестировано). Значит, при действиях на карте, он проверяет, есть ли у него Городской портал и какой у него уровень Магии Земли.

Можно ли как-то определить участок кода, где это делается ? То есть можно ли, например, отследить обращения к данному поле в объекте Герой (Магия Земли) ?
Go to the top of the pageAdd Nick
 
+Quote Post

23 страниц V  « < 17 18 19 20 21 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 20 December 2025 - 18:59
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика