Объявления

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

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

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

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

Сообщение Rolex » 17 фев 2021, 14:28

@RoseKavalier
Can you help fix the code I posted above so that I can compile it?
Вернуться к началу

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

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

Сообщение RoseKavalier » 17 фев 2021, 15:03

I mean, you have all information.

1. I wrote
Код: Выделить всё
c->Ebx<>()
, you wrote
Код: Выделить всё
c->ebx

2. Look in comment, the old function is right there.
Вернуться к началу

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

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

Сообщение Rolex » 17 фев 2021, 16:06

Thanks. Fixed.

Код: Выделить всё
#define _CRT_SECURE_NO_WARNINGS
#define _H3API_LIBRARY_
#define _H3API_PATCHER_X86_

#include "H3API/lib/H3API.hpp"

using namespace h3;


Patcher* _P;
PatcherInstance* _PI;


int __stdcall AdvMapGeneratorUpgrades(LoHook *h, HookContext *c)
{
   auto& dwelling = c->Ebx<H3Dwelling>();
   if (dwelling.creatureTypes[1] != -1) // not GENERATOR_1 type
      return EXEC_DEFAULT;

//   int upgrade = H3Creature::GetUpgrade(dwelling.creatureTypes[0]); // was F_GetCreatureUpgrade(int), I am deprecating all F_ functions in upcoming update...
   int upgrade = F_GetCreatureUpgrade(dwelling.creatureTypes[0]);
   if (upgrade == -1) // neutral creature
      return EXEC_DEFAULT;

   c->Pop();
   c->Pop();
   c->Push(int(&dwelling.creatureCounts[0])); // share creature count with unupgraded type
   c->Push(upgrade);

   return EXEC_DEFAULT;
}

void HooksInit()
{
   // Hook
   _PI->WriteLoHook(0x4ABA2F, AdvMapGeneratorUpgrades);
}

const char* PLUGIN_NAME = "CreatureUpgrade";

BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
   static BOOL pluginOn = FALSE;
   switch (ul_reason_for_call)
   {
   case DLL_PROCESS_ATTACH:
      if (!pluginOn)
      {
         _P = GetPatcher();
         _PI = _P->CreateInstance(PLUGIN_NAME);


         HooksInit();
      }
      break;
   case DLL_THREAD_ATTACH:
   case DLL_THREAD_DETACH:
   case DLL_PROCESS_DETACH:
      break;
   }
   return TRUE;
}


But it still fails to compile (VS 2015):
 Errors (2)
Error LNK2001: unresolved external symbol ""int __cdecl h3::F_GetCreatureUpgrade(int)" (?F_GetCreatureUpgrade@h3@@YAHH@Z)"
Error LNK1120: Unresolved External Items: 1
Вернуться к началу

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

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

Сообщение RoseKavalier » 18 фев 2021, 01:37

Код: Выделить всё
#define _H3API_LIBRARY_

You should probably only use that if you compile the library (H3API.lib) first.
Without that, it acts as header-only and you don't need to do anything else not even add the files in your project.
Вернуться к началу

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 » 18 фев 2021, 07:28

Цитата:
5. Плагин, который бы автоматически принимал ход и сразу его пропускал (Это пригодилось бы для наблюдения за игроками - зайти в виде доп. игрока союзником и наблюдать за пемещениями игрока). Вообще для возможности и комфорта наблюдения за игроками не хватает только этого плагина и возможности просмотра финалки между игроками (за обычными боями игроков можно смотреть через опцию пвп битвы нейтрали). С ними бы игрокам можно было даже не стримить свои игры.


Один из способов автоскипа хода игрока:

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

Patcher* _P;
PatcherInstance* _PI;
static _bool_ plugin_On = 0;

int __stdcall skipMessages(LoHook* h, HookContext* c)
{
    if ( o_ActivePlayerID == 1 ) {
        c->return_address = 0x4F6E98;
        return NO_EXEC_DEFAULT;
    }

    return EXEC_DEFAULT;
}

_DlgMsg_ msg = {512, 13, 12, 0, 0, 0, 0, 0};
int __stdcall skipTurn(LoHook* h, HookContext* c)
{
    if ( o_ActivePlayerID == 1 ) {
        *(int*)(c->ebp + 8) = (int)&msg;
    }

    return EXEC_DEFAULT;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    if ( DLL_PROCESS_ATTACH == ul_reason_for_call )
    {
        if ( !plugin_On )
        {
            plugin_On = 1;
            _P = GetPatcher();
            _PI = _P->CreateInstance((char*)"HD.Plugin.SkipTurns");

            _PI->WriteLoHook(0x4F6C00, skipMessages);
            _PI->WriteLoHook(0x40871A, skipTurn);
        }
    }

    return TRUE;
}

1 - это номер (цвет) игрока, можно задать в условии сразу несколько.

* * *
Кода выше достаточно для рандомных карт, но если нужно скипать сообщения на фиксах, то необходимо также пропускать DisplayComplexDialog():

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

Patcher* _P;
PatcherInstance* _PI;
static _bool_ plugin_On = 0;

int __stdcall skipMessageDlg(LoHook* h, HookContext* c)
{
    if ( o_ActivePlayerID == 1 ) {
        c->return_address = 0x4F6E98;
        return NO_EXEC_DEFAULT;
    }

    return EXEC_DEFAULT;
}

int __stdcall skipComplexDlg(LoHook* h, HookContext* c)
{
    if ( o_ActivePlayerID == 1 ) {
        c->return_address = 0x4F802F;
        return NO_EXEC_DEFAULT;
    }

    return EXEC_DEFAULT;
}

_DlgMsg_ msg = {512, 13, 12, 0, 0, 0, 0, 0};
int __stdcall skipTurn(LoHook* h, HookContext* c)
{
    if ( o_ActivePlayerID == 1 )
        *(int*)(c->ebp + 8) = (int)&msg;
   
    return EXEC_DEFAULT;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    if ( DLL_PROCESS_ATTACH == ul_reason_for_call )
    {
        if ( !plugin_On )
        {
            plugin_On = 1;
            _P = GetPatcher();
            _PI = _P->CreateInstance((char*)"HD.Plugin.SkipTurns");

            _PI->WriteLoHook(0x4F6C00, skipMessageDlg);
            _PI->WriteLoHook(0x4F7D20, skipComplexDlg);
            _PI->WriteLoHook(0x40871A, skipTurn);
        }
    }

    return TRUE;
}
Вернуться к началу

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

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

Сообщение Rolex » 19 фев 2021, 14:06

RoseKavalier писал(а):

You should probably only use that if you compile the library (H3API.lib) first.
Without that, it acts as header-only and you don't need to do anything else not even add the files in your project.

If I remove #define _H3API_LIBRARY_, there will be other compilation errors.
 Errors
Error C2027 using undefined type "h3 :: H3WavFile" CreatureUpgrade c: \ users \ user \ documents \ visual studio 2015 \ projects \ creatureupgrade \ creatureupgrade \ h3api \ lib \ h3api \ H3Structures \ H3Structures.cpp 1464
Error C2227 the expression to the left of "-> spinCount" must point to a class, structure, or union type, or the generic type CreatureUpgrade c: \ users \ user \ documents \ visual studio 2015 \ projects \ creatureupgrade \ creatureupgrade \ h3api \ lib \ h3api \ H3Structures \ H3Structures.cpp 1464
Error C2027 using undefined type "h3 :: H3WavFile" CreatureUpgrade c: \ users \ user \ documents \ visual studio 2015 \ projects \ creatureupgrade \ creatureupgrade \ h3api \ lib \ h3api \ H3Structures \ H3Structures.cpp 1465
Error C2227 the expression to the left of "-> debugInfo" must point to a class, structure, or union type, or to the generic CreatureUpgrade type c: \ users \ user \ documents \ visual studio 2015 \ projects \ creatureupgrade \ creatureupgrade \ h3api \ lib \ h3api \ H3Structures \ H3Structures.cpp 1465
Error C2027 using undefined type "h3 :: H3WavFile" CreatureUpgrade c: \ users \ user \ documents \ visual studio 2015 \ projects \ creatureupgrade \ creatureupgrade \ h3api \ lib \ h3api \ H3Structures \ H3Structures.cpp 1466
Error C2227 the expression to the left of "-> lockSemaphore" must point to a class, structure, or union type, or the generic type CreatureUpgrade c: \ users \ user \ documents \ visual studio 2015 \ projects \ creatureupgrade \ creatureupgrade \ h3api \ lib \ h3api \ H3Structures \ H3Structures.cpp 1466
Error C2065 H3WavLoader: Undeclared CreatureUpgrade ID c: \ users \ user \ documents \ visual studio 2015 \ projects \ creatureupgrade \ creatureupgrade \ h3api \ lib \ h3api \ H3Structures \ H3Structures.cpp 1481
Error C2146 syntax error: missing ";" before the id "wav" CreatureUpgrade c: \ users \ user \ documents \ visual studio 2015 \ projects \ creatureupgrade \ creatureupgrade \ h3api \ lib \ h3api \ H3Structures \ H3Structures.cpp 1481
Error C3861 wav: CreatureUpgrade id not found c: \ users \ user \ documents \ visual studio 2015 \ projects \ creatureupgrade \ creatureupgrade \ h3api \ lib \ h3api \ H3Structures \ H3Structures.cpp 1481
Error C2065 wav: Undeclared CreatureUpgrade ID c: \ users \ user \ documents \ visual studio 2015 \ projects \ creatureupgrade \ creatureupgrade \ h3api \ lib \ h3api \ H3Structures \ H3Structures.cpp 1482
Error C2065 wav: Undeclared CreatureUpgrade ID c: \ users \ user \ documents \ visual studio 2015 \ projects \ creatureupgrade \ creatureupgrade \ h3api \ lib \ h3api \ H3Structures \ H3Structures.cpp 1483
Error C2065 H3WavLoader: Undeclared CreatureUpgrade ID c: \ users \ user \ documents \ visual studio 2015 \ projects \ creatureupgrade \ creatureupgrade \ h3api \ lib \ h3api \ H3Structures \ H3Structures.cpp 1487
Error C2146 syntax error: missing ";" before the id "wav" CreatureUpgrade c: \ users \ user \ documents \ visual studio 2015 \ projects \ creatureupgrade \ creatureupgrade \ h3api \ lib \ h3api \ H3Structures \ H3Structures.cpp 1487
Error C3861 wav: CreatureUpgrade id not found c: \ users \ user \ documents \ visual studio 2015 \ projects \ creatureupgrade \ creatureupgrade \ h3api \ lib \ h3api \ H3Structures \ H3Structures.cpp 1487
Error C2065 wav: Undeclared CreatureUpgrade ID c: \ users \ user \ documents \ visual studio 2015 \ projects \ creatureupgrade \ creatureupgrade \ h3api \ lib \ h3api \ H3Structures \ H3Structures.cpp 1488
Error C2065 wav: Undeclared CreatureUpgrade ID c: \ users \ user \ documents \ visual studio 2015 \ projects \ creatureupgrade \ creatureupgrade \ h3api \ lib \ h3api \ H3Structures \ H3Structures.cpp 1490
Error C2065 wav: Undeclared CreatureUpgrade ID c: \ users \ user \ documents \ visual studio 2015 \ projects \ creatureupgrade \ creatureupgrade \ h3api \ lib \ h3api \ H3Structures \ H3Structures.cpp 1491
Error C2227 the expression to the left of "-> hSample" must point to a class, structure, or union type, or the generic CreatureUpgrade type c: \ users \ user \ documents \ visual studio 2015 \ projects \ creatureupgrade \ creatureupgrade \ h3api \ lib \ h3api \ H3Structures \ H3Structures.cpp 1491
Error C2027 using undefined type "h3 :: H3WavFile" CreatureUpgrade c: \ users \ user \ documents \ visual studio 2015 \ projects \ creatureupgrade \ creatureupgrade \ h3api \ lib \ h3api \ H3Structures \ H3Structures.cpp 1598
Error C2227 the expression to the left of "-> hSample" must point to a class, structure, or union type, or the generic CreatureUpgrade type c: \ users \ user \ documents \ visual studio 2015 \ projects \ creatureupgrade \ creatureupgrade \ h3api \ lib \ h3api \ H3Structures \ H3Structures.cpp 1598
Error C2672 "h3 :: H3Internal :: H3Thiscall_2": No matching CreatureUpgrade overloaded function found c: \ users \ user \ documents \ visual studio 2015 \ projects \ creatureupgrade \ creatureupgrade \ h3api \ lib \ h3api \ H3Structures \ H3Structures.cpp 1598
Error C2780 return_type h3 :: H3Internal :: H3Thiscall_2 (UINT, Arg1, Arg2): requires arguments: 3, there are: 2 CreatureUpgrade c: \ users \ user \ documents \ visual studio 2015 \ projects \ creatureupgrade \ creatureupgrade \ h3api \ lib \ h3api \ H3Structures \ H3Structures.cpp 1598
Error C2027 using undefined type "h3 :: H3LoadedPcx" CreatureUpgrade c: \ users \ user \ documents \ visual studio 2015 \ projects \ creatureupgrade \ creatureupgrade \ h3api \ lib \ h3api \ H3Structures \ H3Structures.cpp 1716
Error C2227 the expression to the left of "-> DrawToPcx16" must point to a class, structure, or union type, or the generic type CreatureUpgrade c: \ users \ user \ documents \ visual studio 2015 \ projects \ creatureupgrade \ creatureupgrade \ h3api \ lib \ h3api \ H3Structures \ H3Structures.cpp 1716

Can you check it yourself? I just want to understand what I specifically need to do in order to build the dll. Thanks.
Вернуться к началу

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 » 19 фев 2021, 16:05

Цитата:
#include "H3API/lib/H3API.hpp"

Что-то в последних релизах изменилось? У меня H3API.hpp лежит в корне (рядом с папкой h3api).
Вернуться к началу

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

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

Сообщение Rolex » 19 фев 2021, 16:34

AlexSpl писал(а):

Что-то в последних релизах изменилось? У меня H3API.hpp лежит в корне (рядом с папкой h3api).

Я взял вместе с lib и закинул в корень. И прописал путь непосредственно к самой H3API.hpp. Можно скопировать из lib в корень H3API.hpp и папку h3api и тогда #include "H3API.hpp". Как бы без разницы. У меня в любом случае почему-то не получается собрать dll. Хотя в коде ничего не подчеркивает. Ошибки компиляции вылазят имменно в процессе сборки dll. Без _H3API_LIBRARY_ что-то не так с H3Structures.cpp.
Вернуться к началу

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

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

Сообщение RoseKavalier » 19 фев 2021, 17:27

Hmm, I guess it doesn't like relative directories as include-only.
I'm working on the next iteration which doesn't have these issues, I had not planned to release it right now as it's still being tested but I'll see what I can do for later today. Hold on a bit...
Вернуться к началу

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

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

Сообщение RoseKavalier » 20 фев 2021, 04:13

So I rushed this more than I had wanted to, but I checked buildability through VS2008.
H3API 1.6.0

I'd suggest you use "single_header/H3API.hpp"unless you wish to set up the api as a static library.
Вернуться к началу

Пред.След.

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

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

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