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


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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
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 » 28 май 2020, 14:47

Нужно смотреть, что возвращает GetString(). Если указатель на строку в памяти, то всё ОК, если же адрес самой строки, то тогда сложнее.
Вернуться к началу

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 » 28 май 2020, 14:51

Посмотрите пример плагина подмены описаний. Там мы меняем указатель. И строки берутся из нашей DLL, а не из памяти игры.

Как вариант, перенаправлять о_LoadTxt(filename), ибо это точно указатель.
Вернуться к началу

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

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

Сообщение as239 » 28 май 2020, 14:59

Да, изучаю.
Вернуться к началу

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 » 28 май 2020, 15:27

Вот эту нужно хукать для BldgSpec.txt - sub_5B9850. Можно хук на эпилог, сразу после цикла - 0x5B98D7.

Аналогично для HeroSpec.txt - sub_4D7410. Здесь после цикла нет 5 байтов без retn, но я надеюсь патчер retn тоже обрабатывает корректно.
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

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

Сообщение Ben80 » 28 май 2020, 15:43

5 байтов без retn обязательно должны быть, иначе - краши.
Вернуться к началу

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 » 28 май 2020, 15:45

Я не проверял, но стек патчер должен восстанавливать, а в нём как раз адрес возврата. Хотя у этой функции два retn, если не считать первого, когда функция возвращает, что загрузка прошла неуспешно. Может быть, чуть повыше нужно ставить хук.
Вернуться к началу

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 » 28 май 2020, 15:55

Мне кажется, что можно просто o_LoadTXT("HeroSpec.txt")->GetString(index) = {наша строка} с хуком здесь - 0x4D7421.

Нельзя :smile14:
Последний раз редактировалось AlexSpl 28 май 2020, 16:08, всего редактировалось 1 раз.
Вернуться к началу

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

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

Сообщение RoseKavalier » 28 май 2020, 16:07

You can always Hihook if there isn't enough room for LoHook. However 4D747C seems to have 5 bytes of opcode and then 15 or bytes of padding for the next function so plenty safe.

Throwing out this possibility which lets the game handle its own memory...
Hook text loading functions (e.g. HiHook(0x5B9855, CALL_, THISCALL_, ...)) and use the fact that its memory management is simply a vector of char* tokens from a single buffer.
I've added LPCSTR& operator[] access to text files which is not yet available but it's something like this:
Код: Выделить всё
_H3API_ LPCSTR & H3TextFile::operator[](UINT row)
   {
      return text[row];
   }

And then you could simply do
Код: Выделить всё
buildingSpecText[10] = "my new text";


For text tables ...
Код: Выделить всё
_H3API_ H3Vector<LPCSTR>& H3TextTable::operator[](UINT row)
   {
      return *text[row];
   }

textTable[10][0] = "my new text"; // vector has LPCSTR& operator[] access
Вернуться к началу

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

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

Сообщение as239 » 28 май 2020, 16:23

А как работать с "H3TextFile"?
В любом месте где хочу, так:
Код: Выделить всё
H3TextFile fTXT;
fTXT.Load("ARRAYTXT.txt");

Или только по определенным адресам?
И я не очень понимаю процесс.
При запуске txt файлы загружаются в память, это как раз те адреса, которые выше давали.
Но как потом получить эти тексты при старте игры?
Вернуться к началу

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 » 28 май 2020, 16:34

Можно самому не загружать, а изменять указатели на уже загруженные строки. Например, для BldgSpec.txt указатели на названия по адресу 0x6A543C, указатели на описания - 0x6A7874.

Если я правильно посчитал, то у Necromancy Amplifier индекс 48. Например, указатель на описание - 0x6A7874 + 48 * 4.
Вернуться к началу

Пред.След.

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

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

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