Объявления

Друзья, если не получается зарегистрироваться, напишите на почту 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 » 06 авг 2021, 18:28

Нужно ещё по TCP/IP потестить. Как там с гарнизоном после увольнения для других игроков.
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 898
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 53 раз.

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

Сообщение Rolex » 06 авг 2021, 18:33

Да, убрал. Теперь все шикарно, очень шустро, как в HotA.

***

А вот еще интересная задача со звездочкой. Если вдруг будет интересно, то есть три решения: от Ben80, igrik и Sav.

Это плагин, который позволяет просматривать гильдию магов без необходимости покупки книги для героя, находящегося в городе. Вот именно это пытался сделать Ben80.

1) Решение Ben80:
Код: Выделить всё
_PI->WriteByte(0x5CE98B+1, 0x1C);


Относительно других решений самое плохое, так как работает только для героя в гарнизоне.
В итоге:
- гарнизонный герой без книги НЕ может купить книгу, если ему это требуется, без перемещение героя вниз.
- герой-гость без книги НЕ может увидеть заклинания в гильдии магов, если он НЕ хочет покупать книгу, без перемещение героя вверх.
- герой-гость без книги НЕ может увидеть заклинания в гильдии магов, если он НЕ может купить книгу, без перемещение героя вверх.

2) Решение igrik:
Код: Выделить всё
// возможность заходить в гильдию магов без наличия книги и денег
_PI->WriteHexPatch(0x5CEA83, "EB74");
_PI->WriteHexPatch(0x5CEACD, "2800");


Гораздо лучше нежели решение Ben80, но не так удобно, как сделал Sav в HotA. В данном случае мы всегда и при любых раскладах можем зайти в гильдию магов и увидеть в ней заклинания.
В итоге:
- если деньги есть, но книги нет, то после покупки книги заходим в гильдию (как в оригинале).
- если деньги есть, но книги нет, то после отказа от покупки книги мы все равно заходим в гильдию.
- если денег нет и книги нет, то получаем сообщение, что денег на книгу нет, и при этом мы все равно заходим в гильдию.

3) Решение Sav:
Самое оптимальное решение. Похоже на решение igrik, за исключением того, что сначала идет вход в гильдию магов, и только потом уже показ сообщения о покупке книги.

Чтобы повторить это решение Sav, что пока другим ребятам не удалось, нужно сделать так, чтобы сообщение о покупке книги выводилось не до входа в гильдию, как в оригинале, а уже после. Как это сделать?
Последний раз редактировалось Rolex 06 авг 2021, 18:44, всего редактировалось 2 раз(а).
Вернуться к началу

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 » 06 авг 2021, 18:37

Убрать диалог до входа и показывать его после. Но это на словах :smile1: Как там в техническом плане, смотреть нужно.
Вернуться к началу

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 » 06 авг 2021, 18:43

Потестил по TCP/IP. Всё шикарно. Увольнение армии героя из гарнизона отлично видно другим игрокам, даже если не их ход (как в оригинале).
Вернуться к началу

offlineАватара пользователя
void_17  
имя: имя
Ветеран
Ветеран
 
Сообщения: 548
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 132 раз.

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

Сообщение void_17 » 08 авг 2021, 20:06

Что означают выражения по типу
переменная_2 = *(тип*)(переменная_1+число)
?
Насколько я понимаю, это обращение к переменной структуры. Но как понять, какая это структура???
Вернуться к началу

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 » 09 авг 2021, 11:41

По этой строчке - никак. Можно проанализировать код, который работает с v2, и сделать выводы. Сама запись означает, что мы читаем число как DWORD (4 байта без знака) по адресу a1 + 64.
Вернуться к началу

offlineАватара пользователя
void_17  
имя: имя
Ветеран
Ветеран
 
Сообщения: 548
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 132 раз.

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

Сообщение void_17 » 09 авг 2021, 12:44

Есть у кого разобранные поля _RMGMapItem_?
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 898
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 53 раз.

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

Сообщение Rolex » 11 авг 2021, 10:36

AlexSpl писал(а):

Убрать диалог до входа и показывать его после. Но это на словах :smile1: Как там в техническом плане, смотреть нужно.

Не смотрели еще, как там обстоят дела в техническом плане? :smile1:
Вернуться к началу

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 » 11 авг 2021, 11:44

Смотрел. Нужно менять местами блоки кода, отвечающие за отображение сообщений и окна магической гильдии.

 
Код: Выделить всё
_WndMan_ *__thiscall sub_005CE960(int this)
{
  int v1; // eax
  int v2; // ecx
  int v3; // esi
  _Hero_ *v4; // edi
  int v5; // ecx
  _WndMan_ *result; // eax
  int v7; // edx
  _Dlg_ *v8; // eax
  _Dlg_ *v9; // eax
  void (__cdecl ***v10)(signed int); // ecx
  int v11; // edi
  _DlgPanel_ *v12; // eax
  int v13; // eax
  int v14; // eax
  int (__cdecl ***v15)(signed int); // ecx
  int (__cdecl ***v16)(signed int); // ecx
  char P2[4]; // [esp+Ch] [ebp-18h]
  int v18; // [esp+10h] [ebp-14h]
  void *v19; // [esp+14h] [ebp-10h]
  int v20; // [esp+20h] [ebp-4h]

  v3 = this;
  v1 = *(_DWORD *)(this + 56);
  v2 = *(_DWORD *)(v1 + 16);
  if ( v2 == -1 )
  {
    v5 = *(_DWORD *)(v1 + 12);
    if ( v5 == -1 )
      goto LABEL_16;
    v4 = &Main_Structure->Heroes[v5];
  }
  else
  {
    v4 = &Main_Structure->Heroes[v2];
  }
  if ( !v4 || DoesHeroHaveArt(v4, 0) || !IsThisGamer2((int)PlayerStructPo) )
  {
LABEL_16:
    v8 = (_Dlg_ *)new(96);
    v19 = v8;
    v20 = 0;
    if ( v8 )
      v9 = Dlg_ShowMagicGuildSpells(v8);
    else
      v9 = 0;
    v20 = -1;
    *(_DWORD *)(v3 + 444) = v9;
    if ( !v9 )
      TerminateOutOfMemory();
    Sub_005D72F0_ConfluxGrailCheck((void *)v3, *(_Dlg_ **)(v3 + 444));
    v10 = *(void (__cdecl ****)(signed int))(v3 + 320);
    v11 = *(_DWORD *)(v3 + 444);
    if ( v10 )
    {
      (**v10)(1);
      *(_DWORD *)(v3 + 320) = 0;
    }
    v12 = (_DlgPanel_ *)new(120);
    v19 = v12;
    v20 = 1;
    if ( v12 )
      v13 = DlgPanel_BuildBottomResBar(v12, v11, 1);
    else
      v13 = 0;
    v20 = -1;
    *(_DWORD *)(v3 + 320) = v13;
    RedrawCurDayPart(v13, 1, 0);
    v14 = *(_DWORD *)(v3 + 432);
    if ( v14 )
      *(_DWORD *)(v14 + 12) = *(_DWORD *)(v3 + 320);
    (*(void (__cdecl **)(signed int, signed int, signed int))(**(_DWORD **)(v3 + 444) + 20))(1, -65535, 0xFFFF);
    RedrawPartOfScreen(pHeroWindowManager, 0, 0, 800, 600);
    (*(void (__cdecl **)(_DWORD))(**(_DWORD **)(v3 + 444) + 24))(0);
    result = *(_WndMan_ **)(v3 + 432);
    if ( result )
      result->field_C = *(_DWORD *)(v3 + 316);
    v15 = *(int (__cdecl ****)(signed int))(v3 + 320);
    if ( v15 )
      result = (_WndMan_ *)(**v15)(1);
    v16 = *(int (__cdecl ****)(signed int))(v3 + 444);
    *(_DWORD *)(v3 + 320) = 0;
    if ( v16 )
      result = (_WndMan_ *)(**v16)(1);
    return result;
  }
  if ( CampaignGame && v4->Number == 45 && Main_Structure->Campaign.BigCampaignIndex == 14 )
    return (_WndMan_ *)MessageDialog(
                         *(char **)(*(_DWORD *)(Genrltxt_TXT_Loaded + 32) + 2948),
                         1,
                         -1,
                         -1,
                         -1,
                         0,
                         -1,
                         0,
                         -1,
                         0,
                         -1,
                         0);
  if ( PlayerStructPo->Resources[6] < 500 )
    return (_WndMan_ *)MessageDialog(
                         *(char **)(*(_DWORD *)(Genrltxt_TXT_Loaded + 32) + 856),
                         1,
                         -1,
                         -1,
                         8,
                         0,
                         -1,
                         0,
                         -1,
                         0,
                         -1,
                         0);
  MessageDialog(*(char **)(*(_DWORD *)(Genrltxt_TXT_Loaded + 32) + 860), 2, -1, -1, 8, 0, -1, 0, -1, 0, -1, 0);
  result = pHeroWindowManager;
  if ( pHeroWindowManager->ResultItemId != 30726 )
  {
    *(_DWORD *)P2 = 0;
    v18 = -1;
    GiveArtToHeroAndDoAllThatIsNeeded(v4, v7, (unsigned int)P2, 1, (int *)1);
    PlayerStructPo->Resources[6] -= 500;
    goto LABEL_16;
  }
  return result;
}

Кстати, о какой кампании и каком сообщении при заходе в магическую гильдию здесь речь:

Код: Выделить всё
if ( CampaignGame && v4->Number == 45 && Main_Structure->Campaign.BigCampaignIndex == 14 )

Может, про Йога (Birth of the Barbarian)? Ему, вроде, запрещено было пользоваться магией сначала.

Изображение

Код: Выделить всё
v10 = *(void (__cdecl ****)(signed int))(v3 + 320);

С++, как коньяк :smile1: 4 звезды ещё не встречал в коде игры.
Последний раз редактировалось AlexSpl 11 авг 2021, 11:56, всего редактировалось 1 раз.
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 898
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 53 раз.

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

Сообщение Rolex » 11 авг 2021, 11:53

AlexSpl писал(а):

Смотрел. Нужно менять местами блоки кода, отвечающие за отображение сообщений и окна магической гильдии.

А сложно ли будет это сделать?

AlexSpl писал(а):

Кстати, о какой кампании и каком сообщении при заходе в магическую гильдию здесь речь

Да, скорей всего про Йога, хотя... :smile5:

AlexSpl писал(а):

С++, как коньяк :smile1: 4 звезды ещё не встречал в коде игры.

Ого, зачем аж столько? Да уж, C++ не PHP, его можно всю жизнь изучать и толком не знать. :smile1:
Вернуться к началу

Пред.След.

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

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

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

cron