Объявления

Друзья, если не получается зарегистрироваться, напишите на почту 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 » 04 окт 2017, 17:15

Интересная идея с ghost hero. Я бы не додумался.

* * *
Крашится по правому клику на герое.

Можете прокомментировать вот этот участок кода:
Код: Выделить всё
_Hero_* hero = (_Hero_*)(*(int*)(c->ebp + 8));
   if((int)(hero->disguise) > -1)
   {
       CALL_2(_Hero_*, __thiscall, 0x406410, (_Hero_*)(pHeroes[hero->owner_id]), hero);
       *(int*)(c->ebp + 8) = pHeroes[hero->owner_id];
       hero = (_Hero_*)(*(int*)(c->ebp + 8));
       ...

Вместо _Hero_* hero = (_Hero_*)(*(int*)(c->ebp + 8)); лучше писать _Hero_* hero = *(_Hero_**)(c->ebp + 8);

hero->disguise почему-то беззнаковое в хедерах, но можно и без приведения типа обойтись: заменить условие (int)(hero->disguise) > -1 на hero->disguise != -1.
Вернуться к началу

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

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

Сообщение Ben80 » 04 окт 2017, 17:38

AlexSpl писал(а):

Интересная идея с ghost hero. Я бы не додумался.

* * *
Крашится по правому клику на герое.

Можете прокомментировать вот этот участок кода:
Код: Выделить всё
_Hero_* hero = (_Hero_*)(*(int*)(c->ebp + 8));
   if((int)(hero->disguise) > -1)
   {
       CALL_2(_Hero_*, __thiscall, 0x406410, (_Hero_*)(pHeroes[hero->owner_id]), hero);
       *(int*)(c->ebp + 8) = pHeroes[hero->owner_id];
       hero = (_Hero_*)(*(int*)(c->ebp + 8));
       ...

Вместо _Hero_* hero = (_Hero_*)(*(int*)(c->ebp + 8)); лучше писать _Hero_* hero = *(_Hero_**)(c->ebp + 8);

hero->disguise почему-то беззнаковоев хедерах, но можно и без привидения типа обойтись: заменить условие (int)(hero->disguise) > -1 на hero->disguise != -1.


Кажется, не совсем то написал, что хотел - в плане распределения ghost heroes по ячейкам. Не
Код: Выделить всё
pHeroes[hero->owner_id]


а что-то вроде

Код: Выделить всё
pHeroes[o_ActivePlayerID]


в общем id игрока, который просматривает, а не которого.

AlexSpl писал(а):

лучше писать _Hero_* hero = *(_Hero_**)(c->ebp + 8);


У меня так не компилируется.

AlexSpl писал(а):

Можете прокомментировать вот этот участок кода:

Получаем указатель на просматриваемого героя, копируем его в призрачного героя, подменяем для процедуры анализа героя - настоящего на призрачного и, наконец, работаем с призрачным героем и в своем коде.

AlexSpl писал(а):

Крашится по правому клику на герое.


Ну, я бы не стал выкладывать что-то, если бы у меня совсем не работало. Вот не знаю, почему у Вас крашится, а у меня показывает то, что планировал...
Вернуться к началу

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

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

Сообщение Ben80 » 04 окт 2017, 17:39

Ben80 писал(а):

AlexSpl писал(а):

лучше писать _Hero_* hero = *(_Hero_**)(c->ebp + 8);


У меня так не компилируется.


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

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 » 04 окт 2017, 17:42

Цитата:
Ну, я бы не стал выкладывать что-то, если бы у меня совсем не работало. Вот не знаю, почему у Вас крашится, а у меня показывает то, что планировал...

Тестирую в хотсите. Пропускаю ход красного. Синий кастует Disguise и смотрит свою армию по правому клику на иконке его единственного героя. Вылетает с ошибкой.
Вернуться к началу

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

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

Сообщение Ben80 » 04 окт 2017, 17:53

Попробовал сделать также, не крашнулось, а показало преувеличенную численность войск.

У Вас ведь Хота ? Я то на Соде тестирую.

Может быть, краш лог покажете ? Хотя, если на Хоте, то это мне пока не очень интересно.
Вернуться к началу

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 » 04 окт 2017, 18:03

Да, тестирую на Хоте. Вероятно, в том районе хуки :smile2:

В Соде, действительно, работает :smile20: Позже посмотрю код более внимательно.
Последний раз редактировалось AlexSpl 04 окт 2017, 18:06, всего редактировалось 1 раз.
Вернуться к началу

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

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

Сообщение Ben80 » 04 окт 2017, 18:05

Ben80 писал(а):

Кажется, не совсем то написал, что хотел - в плане распределения ghost heroes по ячейкам. Не
Код: Выделить всё
pHeroes[hero->owner_id]


а что-то вроде

Код: Выделить всё
pHeroes[o_ActivePlayerID]


в общем id игрока, который просматривает, а не которого.



GetMeID() подойдет ?
Вернуться к началу

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 » 04 окт 2017, 18:08

Да, именно в таких случаях GetMeID() и нужно использовать, чтобы идентифицировать себя как игрока. Если, конечно, нужно вот это:

Цитата:
в общем id игрока, который просматривает, а не которого.


Если наоборот, то следует брать оунера героя.
Вернуться к началу

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

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

Сообщение Ben80 » 04 окт 2017, 18:14

Да, это нужно, поскольку один игрок может одномоментно просматривать только одного героя. Поэтому если привязать ячейку к нему, то их будет максимум 8 и они будут однозначно распределены.

А если номера ячеек привязать к овнерам просматриваемых героев - то ничего хорошего не получится, если например одного героя Игрока 1 просматривают одновременно Игрок 2 и Игрок 3.
Вернуться к началу

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

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

Сообщение Ben80 » 04 окт 2017, 18:15

Так что вот это код пока последний:

Код: Выделить всё
#include "..\..\include\homm3.h"

Patcher* _P;
PatcherInstance* _PI;

_Hero_* ghero1 = new _Hero_();
_Hero_* ghero2 = new _Hero_();
_Hero_* ghero3 = new _Hero_();
_Hero_* ghero4 = new _Hero_();
_Hero_* ghero5 = new _Hero_();
_Hero_* ghero6 = new _Hero_();
_Hero_* ghero7 = new _Hero_();
_Hero_* ghero8 = new _Hero_();


int __stdcall makeGhostHero(LoHook* h, HookContext* c)
{
   int pHeroes[8];
   pHeroes[0] = (int)ghero1;
   pHeroes[1] = (int)ghero2;
   pHeroes[2] = (int)ghero3;
   pHeroes[3] = (int)ghero4;
   pHeroes[4] = (int)ghero5;
   pHeroes[5] = (int)ghero6;
   pHeroes[6] = (int)ghero7;
   pHeroes[7] = (int)ghero8;

   _Hero_* hero = (_Hero_*)(*(int*)(c->ebp + 8));
   if((int)(hero->disguise) > -1)
   {
      CALL_2(_Hero_*, __thiscall, 0x406410, (_Hero_*)(pHeroes[o_GameMgr->GetMeID()]), hero);
       *(int*)(c->ebp + 8) = pHeroes[o_GameMgr->GetMeID()];
      hero = (_Hero_*)(*(int*)(c->ebp + 8));
      hero->disguise = -1;
   
      int multiplier = 5;
      
      for(int i=0; i<7; i++)
         hero->army.count[i] = multiplier * hero->army.count[i];

   }

   return EXEC_DEFAULT;
}


int __stdcall discountPackedDisguise(LoHook* h, HookContext* c)
{
    for (int i = 0; i < o_HEROES_COUNT; ++i)
        if ( o_GameMgr->GetHero(i)->owner_id == o_GameMgr->GetMeID() )
      {
         int disguise = (int)(o_GameMgr->GetHero(i)->disguise);
         if(disguise!=-1)
            o_GameMgr->GetHero(i)->disguise--;
      }

    return EXEC_DEFAULT;
}


int __stdcall setPackedDisguise(LoHook* h, HookContext* c)
{
   c->edi = 1;

   return EXEC_DEFAULT;
}


BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved )
{
    static _bool_ plugin_On = 0;
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        if (!plugin_On)
        {
            plugin_On = 1;       

            _P = GetPatcher();
            _PI = _P->CreateInstance("HD.Plugin.TestDisguise");

         _PI->WriteHexPatch(0x4C7DA5, "90 90 90");
         _PI->WriteLoHook(0x4C75E0, discountPackedDisguise);
         _PI->WriteLoHook(0x52EFEB, makeGhostHero);
         _PI->WriteLoHook(0x41C7C6, setPackedDisguise);
        }
        break;

    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

Вернуться к началу

Пред.След.

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

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

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

cron