Объявления

Форум о Героях Меча и Магии и King's Bounty. Если Вы любите эти игры, мы будем рады видеть Вас в наших рядах. :smile2:

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

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

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

Сообщение as239 » 05 мар 2019, 17:39

Ben80 писал(а):

По поводу проверки у кого из клиентов подключен плагин - есть решение делать это через отправку сообщений в чат.
Какое именно это будет сообщение, задается в плагине, соответственно, выдать другой подключенный плагин за данный вряд ли получиться (если, конечно, читер не является хакером, ну а если он хакер, то с ним вообще вряд ли стоит бороться).

На днях покажу код.


Да, хороший вариант.
Вернуться к началу

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

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

Сообщение Ben80 » 05 мар 2019, 19:46

Сообщение отправляется на 2 день 1 недели 1 месяца.

Это, конечно, всего лишь временное решение, и настоящие проверки должен делать
сам HD мод, вычисляя контрольные суммы для подключенных плагинов и сравнивая их для разных клиентов.

Однако конкретно для моего проекта, в котором используются опции из ini файла, и есть необходимость вывести
в чат информацию о том, какие именно опции используются на каждом клиенте, данное решение выручает - тут
выполнение кода самим HD модом не поможет, поскольку HD мод не может быть осведомлен об опциях конкретных плагинов, и логике их работы...

Код: Выделить всё
int __stdcall send2Chat(LoHook* h, HookContext* c) {
   char* mes = "Plugin XYZ is used";
   if(o_GameMgr->curr_day_ix == 2 && o_GameMgr->curr_week_ix == 1 && o_GameMgr->curr_month_ix == 1)
      CALL_2(char, __fastcall, 0x554BB0, mes, 127);
   return EXEC_DEFAULT;
}
...
_PI->WriteLoHook(0x4C7207, send2Chat);
Вернуться к началу

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

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

Сообщение Ben80 » 05 мар 2019, 19:51

Так, пожалуй, еще получше будет:

Код: Выделить всё
int __stdcall send2Chat(LoHook* h, HookContext* c) {
   char* mes = "Plugin XYZ is used";
   if(o_NetworkGame && o_GameMgr->curr_day_ix == 2 &&
   o_GameMgr->curr_week_ix == 1 && o_GameMgr->curr_month_ix == 1)
      CALL_2(char, __fastcall, 0x554BB0, mes, 127);
   return EXEC_DEFAULT;
}
...
_PI->WriteLoHook(0x4C7207, send2Chat);
Вернуться к началу

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

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

Сообщение Ben80 » 05 мар 2019, 21:14

Интересно, можно ли получить информацию о загруженных плагинах не с помощью HD мода, а с помощью самого же плагина. Например, чтобы понять, не подгрузил ли читер какую-нибудь дополнительную DLL.

Нашел пару ссылок:
http://www.nookery.ru/decided-how-to-kn ... s-program/
http://www.nookery.ru/how-do-i-get-a-li ... modules-c/
http://www.programmersclub.ru/%D0%A3%D0 ... %BA%D0%B0/
Вернуться к началу

offlinefeanor  
Новичок
Новичок
 
Сообщения: 14
Зарегистрирован: 15 мар 2016, 16:23
Пол: Не указан
Поблагодарили: 15 раз.

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

Сообщение feanor » 06 мар 2019, 22:09

По первым двум ссылкам решение на C#, такая себе помощь, только что имена функций.

Так что, для справедливости, оставлю сразу мсдновские ссылки
https://docs.microsoft.com/en-us/window ... 32snapshot
https://docs.microsoft.com/ru-ru/window ... -processes
https://docs.microsoft.com/ru-ru/window ... odule-list
Вернуться к началу

offlineАватара пользователя
Catastrophe  
имя: Alex
Посвященный
Посвященный
 
Сообщения: 88
Зарегистрирован: 07 мар 2019, 11:50
Пол: Мужчина
Поблагодарили: 22 раз.

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

Сообщение Catastrophe » 07 мар 2019, 12:09

AlexSpl писал(а):

Цитата:
Нужно сделать Слабость, Забывчивость, Радость, Удачу, Печаль, Неудачу масс. спеллами на любом уровне магии, даже на основном.

Код: Выделить всё
int __stdcall massSpell(LoHook* h, HookContext* c)
{
   int spells[] = {45, 49, 50, 51, 52, 61};
   int spellID = c->ebx;
      
   for (int i = 0; i < sizeof(spells) / sizeof(int); ++i)
   {
      if ( spellID == spells[i] )
      {
         c->eax = 0;
         break;
      }
   }
         
   return EXEC_DEFAULT;
}

...

_PI->WriteLoHook(0x59F136, massSpell)


У этого кода есть очень серьезный минус - он не работает на спеллы, наложенные героями ИИ.
RoseKavalier переписал его с HiHook и теперь он работает даже для монстров спеллкастеров:

Код: Выделить всё
char __stdcall IsSpellSingleTarget(HiHook *h, int spell, int ssLevel)
{
   switch (spell)
   {
   case 27: case 28: case 29: case 30: case 31: case 32: case 33: case 36: case 43: case 44: case 45:
   case 46: case 48: case 49: case 50: case 51: case 52: case 53: case 54: case 55: case 58: // Spell IDs
      return FALSE;
      break;
   default:
      return CALL_2(char, __fastcall, h->GetDefaultFunc(), spell, ssLevel);
   }
}

...

_PI->WriteHiHook(0x59E360, SPLICE_, EXTENDED_, FASTCALL_, IsSpellSingleTarget);


Изображение
Быстрее всего смогу ответить вам в Telegram: @PleaseAndThankYou
Вернуться к началу

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

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

Сообщение Ben80 » 07 мар 2019, 14:48

Посмотрите плагин NewMirth, там для ИИ все работало.
Вернуться к началу

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

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

Сообщение RoseKavalier » 08 мар 2019, 04:29

as239 писал(а):

Can not find what is "mon".

Изображение

Sorry, mon is my usual abbreviation for monster aka curStack.

I realized I did not address correctly this issue after posting that code but have had no time to fix it since.

In combat manager (_BattleMgr_) , field 132DC contains what you need: it is the index of CRCOMBAT.def.
Код: Выделить всё
INT32 move_type; // +0x132DC ~ 01 move, 03 ~ range, 05 ~ hover your allies, 07 ~ melee attack, 15 ~ half ranged damage

   Pointer Type
0   Null/Not Allowed
1   Move
2   Fly
3   Shooting (Arrow)
4   Hero (Helmet)
5   Question Mark
6   Arrow Pointer
7   Attack Northeast (Sword)
8   Attack East (Sword)
9   Attack Southeast (Sword)
10   Attack Southwest (Sword)
11   Attack West (Sword)
12   Attack Northwest (Sword)
13   Attack North (Sword)
14   Attack South (Sword)
15   Half Damage (Broken Arrow)
16   Attack Wall (Catapult)
17   Heal
18   Sacrifice
19   Teleport
Последний раз редактировалось RoseKavalier 15 мар 2019, 18:40, всего редактировалось 1 раз.
Вернуться к началу

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

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

Сообщение as239 » 08 мар 2019, 06:59

Цитата:
In combat manager (_BattleMgr_) , field 132DC contains what you need:

Thahks! Here is the final code:

Код: Выделить всё
   int MinDamage, MaxDamage, DamageKt=1;

    _BattleStack_* foeStack = *(_BattleStack_**)(c->ebp + 8);
   _BattleStack_* curStack = o_BattleMgr->GetCurrentStack();
   
   int curStackID = curStack->creature_id;
      
   bool IsMelee = (*(int*)o_BattleMgr->Offset(0x132DC)==7);
   if ( ( curStackID == CID_MARKSMAN || curStackID == CID_GRAND_ELF ) && (!IsMelee) )
      DamageKt = 2;

   _Hero_* CurHero = o_BattleMgr->hero[ o_BattleMgr->current_side ];
   if ( CurHero && curStackID == CID_BALLISTA) {
      int ARTI_Level = CurHero->second_skill[ HSS_ARTILLERY ];
      if ( ARTI_Level == 2 ) DamageKt = 2;
      else if ( ARTI_Level == 3 ) DamageKt = 4; 
   }

   MinDamage = DamageKt*c->edi;
   MaxDamage = DamageKt*c->eax;
Последний раз редактировалось as239 08 мар 2019, 07:01, всего редактировалось 1 раз.
Вернуться к началу

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

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

Сообщение as239 » 08 мар 2019, 07:00

Ben80 писал(а):

Так, пожалуй, еще получше будет:

Код: Выделить всё
int __stdcall send2Chat(LoHook* h, HookContext* c) {
   char* mes = "Plugin XYZ is used";
   if(o_NetworkGame && o_GameMgr->curr_day_ix == 2 &&
   o_GameMgr->curr_week_ix == 1 && o_GameMgr->curr_month_ix == 1)
      CALL_2(char, __fastcall, 0x554BB0, mes, 127);
   return EXEC_DEFAULT;
}
...
_PI->WriteLoHook(0x4C7207, send2Chat);


Спасибо! Проверил все работает.
Вернуться к началу

Пред.След.

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

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

Сейчас этот форум просматривают: Bing [Bot] и гости: 1