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


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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineRoseKavalier  
Мастер
Мастер
 
Сообщения: 331
Зарегистрирован: 23 сен 2017, 17:00
Пол: Не указан
Поблагодарили: 234 раз.

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

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

Код: Выделить всё
H3TextTable& __stdcall _HH_LoadHeroSpecTxt(HiHook* h, LPCSTR filename)
{
   H3TextTable& heroSpecText = THISCALL_1(H3TextTable&, h->GetDefaultFunc(), filename);

   // code in here

   return heroSpecText;
}


pi->WriteHiHook(0x4D7415, CALL_, THISCALL_, _HH_LoadHeroSpecTxt);


I unfortunately lacked inspiration when I first named text files, in upcoming H3API I made the difficult decision of renaming these as:
H3ColumnTextFile -> H3TextFile (single column of text)
H3TextFile -> H3TextTable (multiple columns of text)

H3TextFile::Load() is a static function so you would need to assign its result to another H3TextFile.
I could add a constructor to H3TextFile with filename, makes sense.

EDIT
heroSpecText is a textTable, not H3ColumnTextFile
Replaced by future naming for posterity. (currently would be H3TextFile, blergh)
Последний раз редактировалось RoseKavalier 29 май 2020, 11:38, всего редактировалось 2 раз(а).
Вернуться к началу

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

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

Сообщение Ben80 » 29 май 2020, 04:50

В общем, у меня получилось вот что:

Код: Выделить всё
   char* newString;
   ...
   char* oldString = "Old number is 10";
   char* newNumber = "1000";
   int newNumberLength = strlen(newNumber);
   newString = new char[strlen(oldString) + 10];

   bool wasCopiedNewNumber = false;
   int i = 0;
   int j = 0;
   do
   {
      if(!isdigit(oldString[i]))
      {
         newString[j] = oldString[i];
         j++;
      }
      else
      {
         if(!wasCopiedNewNumber)
         {
            wasCopiedNewNumber = true;
            for(int k = 0; k < newNumberLength; k++)
            {
               newString[j+k] = newNumber[k];
            }
            j += newNumberLength;
         }
      }
      i++;
   }
   while(oldString[i - 1] != '\0');


Из входных данных здесь только
Код: Выделить всё
   char* oldString = "Old number is 10";
   char* newNumber = "1000";

Остальной код более или менее универсален. Соответственно, у as239 значением oldString будет какой-то конкретный адрес в оригинальной игре.
Последний раз редактировалось Ben80 29 май 2020, 06:00, всего редактировалось 1 раз.
Вернуться к началу

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

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

Сообщение as239 » 29 май 2020, 05:56

Сделал вот так, все работает и в обратную сторону тоже:
Код: Выделить всё
      p = strstr(strNA, "10%.");
      if (p)
      {
         *p = '2';
         *(p + 1) = '%';
         *(p + 2) = '.';
         *(p + 3) = '\0';
      }


Это из-за того что я не превышаю изначальный размер?
Вернуться к началу

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

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

Сообщение Ben80 » 29 май 2020, 06:02

Не знаю )
Поправил строку в своем коде
Код: Выделить всё
while(oldString[i - 1] != '\0');


Просто ранее никогда не применял do ... while. А тут решил повоображать ))
Вернуться к началу

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

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

Сообщение as239 » 29 май 2020, 08:10

А по какому адресу хранится описание специализаций?
Пробывал так, не работает:
Код: Выделить всё
   char *strSpec = *(char**)(0x679C80 + 71 * 4);
   char *strSpec = *(char**)(0x678420 + 71 * 4);


Такое впечатление что они хранятся в H3HeroSpecialty.spDescr.
Но что не пойму как получить нужный элемент этой структуры.
Пробовал так:
Код: Выделить всё
   H3HeroSpecialty *Spec = &P_HeroSpecialty[0];
Вернуться к началу

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

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

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

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

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

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

Сообщение Ben80 » 29 май 2020, 09:19

Иногда при программировании возникает впечатление что "тебя дурят" (программа, компилятор, и тд), естественно, это чисто эмоциональное впечатление, ошибочное. В Героях 3 я в таких случаях частенько обращаюсь к Olly чтобы "вывести на чистую воду негодяяев" )))
Вернуться к началу

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 » 29 май 2020, 09:46

Пробуйте так:

Код: Выделить всё
char buffer[256];
strcpy(buffer, *(char**)(0x678420 + 0x24 + specId * 0x28));
Вернуться к началу

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

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

Сообщение as239 » 29 май 2020, 09:56

Вот так получаю нужную строку, но при ее изменении, в игре ничего не меняется.
Код: Выделить всё
   char *strSpec = *(char**)(0x678420 + 0x24 + 69 * 0x28);
Вернуться к началу

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 » 29 май 2020, 10:01

Адрес правильный. Проверил на Isra. Работает.
Вернуться к началу

Пред.След.

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

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

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