Объявления
Поздравляем
Roman2211


Друзья, если не получается зарегистрироваться, напишите на почту vdv_forever@bk.ru.
Я оторву свою задницу от всех дел и обязательно Вас активирую! :smile10:
Добро пожаловать на геройский форум! :smile25:

Как создать плагин для HD мода

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: Как создать плагин для HD мода

Сообщение as239 » 26 июн 2020, 09:43

Но по сути картинка то не меняется т.е. мы своего героя не трогаем, движения чужих героев тоже не видим.
А обсчет их хода происходит быстрее.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 26 июн 2020, 09:46

Я про отображение. Фильтр-то всё равно работает.
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: Как создать плагин для HD мода

Сообщение as239 » 04 июл 2020, 08:25

Если я компилирую dll в режиме debug, то все ок.
Если в режиме release, то выходит ошибка, проблема в этой строке, вектор возвращается некорректный:
Код: Выделить всё
_LHF_(CheckPasses){
std::vector<H3Coordinates> *Borders = (std::vector<H3Coordinates>*)(c->ebp - 0x68);
}
....
_PI->WriteLoHook(0x5417DC, CheckPasses);

Почему так? Почему один и тот же код работает по-разному в Debug и Release?

Debug ebp = 1662052;
Release ebp = 1662340;
Влияет только изменение "Code generation\Rintime library": Multi-threaded (/MT) - не работает, Multi-threaded Debug (/MTd) - работает.

Обновлено:
Разобрался, нужно сдвинуть на 4 байта, указатель на вектор, вот так работает:
Код: Выделить всё
std::vector<H3Coordinates> *Borders = (std::vector<H3Coordinates>*)(c->ebp - 0x64);
Вернуться к началу

offlineRoseKavalier  
Мастер
Мастер
 
Сообщения: 331
Зарегистрирован: 23 сен 2017, 17:00
Пол: Не указан
Поблагодарили: 234 раз.

Re: Как создать плагин для HD мода

Сообщение RoseKavalier » 05 июл 2020, 13:48

I don't understand the fine details behind debug mode but I know the stack adds a lot padding and there are a lot more things made so that code can be edited on the fly.
One thing for sure: debug mode changes the layout of std::vector

Изображение

Изображение

Release vector looks something like:
Код: Выделить всё
_Elem* first;
_Elem* last;
_Elem* end;


But debug vector looks something like:
Код: Выделить всё
_Alloc myAllocator; // or something like that
_Elem* first;
_Elem* last;
_Elem* end;


A debug vector more or less matches the VC6 std::vector layout which is what H3Vector emulates.
H3Vector will always match h3 vector whether in debug or release, but std vector will only work in debug mode.
However std::vector still does not know about the custom h3 allocator and that creates problems until it is taught to do so.
Код: Выделить всё
   _A allocator;
   iterator _First, _Last, _End;


In theory it might be possible to define H3Vector with some conditional preprocessor magic but I have not explored that.

EDIT
Just added H3StdVector... it should work the same as std::vector.
I checked VS2013+ and the vector format is consistent. For VS2008 this is impossible to do as size is 20~24
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: Как создать плагин для HD мода

Сообщение as239 » 09 июл 2020, 05:26

Did I understand correctly, my solution with an offset of 4 bytes will work correctly in the release, but incorrectly in debug?
I can not use the option from H3API since for this I need to switch to a new headers, and this will take a lot of time.

Also the main problem for me to use H3Vector is that I can’t see its values ​​while debugging.
Вернуться к началу

offlineRoseKavalier  
Мастер
Мастер
 
Сообщения: 331
Зарегистрирован: 23 сен 2017, 17:00
Пол: Не указан
Поблагодарили: 234 раз.

Re: Как создать плагин для HD мода

Сообщение RoseKavalier » 09 июл 2020, 12:37

VS has replace all functionality)
99% of renames have gone through deprecation steps, which means when you compile you get errors with the named alternative, I updated all my codebases within a few minutes because of that.
You can always copy the H3StdVector implementation but that also means getting the recent H3Allocator if you want to do things other than inspect.
Or print to file/console...
Вернуться к началу

offlineRoseKavalier  
Мастер
Мастер
 
Сообщения: 331
Зарегистрирован: 23 сен 2017, 17:00
Пол: Не указан
Поблагодарили: 234 раз.

Re: Как создать плагин для HD мода

Сообщение RoseKavalier » 12 июл 2020, 05:24

As it turns out, Visual Studio supports custom views of objects since VS2012.

Example for H3Vector
 
Изображение


Here is Natvis sample for H3Vector, using latest H3API version (member names are different on very very old versions)
Код: Выделить всё
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
  <Type Name="h3::H3Vector&lt;*&gt;">
    <DisplayString>{{ size={m_end-m_first} }}</DisplayString>
    <Expand>
      <Item Name="[size]" ExcludeView="simple">m_end-m_first</Item>
      <Item Name="[capacity]" ExcludeView="simple">m_capacity-m_first</Item>
      <ArrayItems>
        <Size>m_end-m_first</Size>
        <ValuePointer>m_first</ValuePointer>
      </ArrayItems>
    </Expand>
  </Type>
</AutoVisualizer>


This funny piece:
Код: Выделить всё
h3::H3Vector&lt;*&gt

stands in for
Код: Выделить всё
h3::H3Vector<>

because of XML :smile5:

I will look into providing Natvis file for common containers in the future... but for now to create a Natvis file:
 
Изображение
Изображение
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: Как создать плагин для HD мода

Сообщение as239 » 07 авг 2020, 08:20

А Как понять что мы находимся на экране города?
Вроде вот так получилось, верно?
Код: Выделить всё
P_Executive->active_mgr == P_TownMgr
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 07 авг 2020, 08:37

Если верить функции ShowTownScreen (sub_5BE610), то мы на экране города, если gAdvDisposeLevel > 0 (*(int*)0x699598 > 0).

Хотя нет, gAdvDisposeLevel > 0 ещё, когда мы в бою. А вот *(int*)0x6AA658 > 0 только на экране города.
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: Как создать плагин для HD мода

Сообщение as239 » 15 авг 2020, 04:17

А как можно понять что игрок нажал "Tab" и пишет сообщение?
А то если он это делает в городе и вводит символ "e", то открывается окно обмена между героями.
Вернуться к началу

Пред.След.

Вернуться в Общий раздел

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

cron