Объявления

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

H3API by RoseKavalier

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

Re: H3API by RoseKavalier

Сообщение RoseKavalier » 24 июн 2020, 15:32

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

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

Re: H3API by RoseKavalier

Сообщение as239 » 27 июн 2020, 06:49

Код: Выделить всё
struct H3Player // size 0x168
{
...
Bool hasHeroes
...
}

I think, it will be more accurate:
Код: Выделить всё
struct H3Player // size 0x168
{
...
char HeroesCount
...
}
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5538
Зарегистрирован: 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)
Поблагодарили: 2155 раз.

Re: H3API by RoseKavalier

Сообщение AlexSpl » 27 июн 2020, 14:22

How to send messages to buttons in a correct way with H3API?

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

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

int turnsToSkip = 5;

struct _MouseStr_
{
   int Type;
   int SubType;
   int Item;
   int Flags;
   int Xabs;
   int Yabs;
   int NewPar;
   int Dialog;
} msg = {0};

int __stdcall testSkipTurn(LoHook* h, HookContext* c)
{
   if ( *(int*)(c->edx + 8) == 0x408710 && o_ActivePlayer->IsHuman() && turnsToSkip > 0 )
   {
      c->eax = (int)&msg;
      
      // o_InputMgr->SendEventMsg(0x200, 0xD, 0xC, 0, 0, 0, 0, 1);
      --turnsToSkip;
   }
   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.TestSkipTurns");
         _PI->WriteLoHook(0x4B0C35, testSkipTurn);
         msg.Type = 0x200;
         msg.SubType = 0xD;
         msg.Item = 0xC;
         msg.NewPar = 1;
      }
   }

   return TRUE;
}

Could it be rewritten with messages?
Вернуться к началу

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

Re: H3API by RoseKavalier

Сообщение as239 » 27 июн 2020, 16:33

Возможно я не понял вопрос, но у меня работает так:
Код: Выделить всё
H3Msg msg;
int turnsToSkip = 13;
_LHF_(testSkipTurn)
{
   if (*(int*)(c->edx + 8) == 0x408710 && h3_ActivePlayer->is_human2 && turnsToSkip > 0)
   {
      c->eax = (int)&msg;

      // o_InputMgr->SendEventMsg(0x200, 0xD, 0xC, 0, 0, 0, 0, 1);
      --turnsToSkip;
   }
   return EXEC_DEFAULT;
}
....
   _PI->WriteLoHook(0x4B0C35, testSkipTurn);
   msg.command = 0x200;
   msg.subtype = 0xD;
   msg.item_id = 0xC;
   msg.parameter = 1;
Вернуться к началу

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

Re: H3API by RoseKavalier

Сообщение RoseKavalier » 27 июн 2020, 20:07

4EC710?
It's not currently part of h3api I think, never had use for it. Feel free to propose the method and I'll add it.
Вернуться к началу

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

Re: H3API by RoseKavalier

Сообщение as239 » 28 июн 2020, 10:02

I would like to automatically copy txt res-file to "...\_HD3_Data\Templates"
Are there any functions for this?

I am trying this:
Код: Выделить всё
   
#include "resource.h"
HRSRC hRes = FindResource(NULL, MAKEINTRESOURCE(IDR_TXT1), RT_RCDATA);
//HRSRC hRes = FindResource(NULL, MAKEINTRESOURCE("RAI.txt"), RT_RCDATA); //RT_RCDATA
   HGLOBAL mem_block = LoadResource(NULL, hRes);
   void* pointer = LockResource(mem_block);
   DWORD siz = SizeofResource(0, hRes);

   HANDLE hFile = CreateFile(TEXT("C:\\Games\\Heroes of Might and Magic III Complete\\_HD3_Data\\Templates\\RAIRES\\rmg.txt"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0);
   DWORD written;
   BOOL is_extracted = WriteFile(hFile, pointer, siz, &written, NULL);
   CloseHandle(hFile);
   if (is_extracted)
   

But file is empty.
Вернуться к началу

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

Re: H3API by RoseKavalier

Сообщение RoseKavalier » 28 июн 2020, 13:10

I fail to see why you're packaging this text file within your project instead of distributing it directly but I wrote myself two raii methods to read/write files... an operation I repeat often for testing whenever I don't use console.

H3File uses CreateFileA to read/write
Код: Выделить всё
H3File f;
f.Save("C:\\Games\\Heroes of Might and Magic III Complete\\_HD3_Data\\Templates\\RAIRES\\rmg.txt");
f.Write(pointer, siz);


H3Stream uses fopen, fwrite, ... to read/write
Код: Выделить всё
H3Stream strm("C:\\Games\\Heroes of Might and Magic III Complete\\_HD3_Data\\Templates\\RAIRES\\rmg.txt", "w");
strm.Write("%s", pointer);
Вернуться к началу

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

Re: H3API by RoseKavalier

Сообщение Ben80 » 28 июн 2020, 13:17

RoseKavalier писал(а):

I wrote myself two raii methods to read/write files... an operation I repeat often for testing whenever I don't use console.


А твои процедуры из H3File возможно использовать, чтобы работало как стандартное ? (из 0x55C070):
Код: Выделить всё
  v3 = fopen(v1, "rb");
  ...
  if ( v3 )
  {
    v27 = 0;
    fseek(v3, 0, 2);
    v6 = ftell(v3);
    v25 = v6;
    fseek(v3, 0, 0);
    v22 = v3;
    v21 = &off_00641144;
    LOBYTE(v27) = 1;
    v5 = new(v6);
    LOBYTE(FMp.AMes.m.l) = v5 != 0;
    FMp.AMes.a = v5;
    LOBYTE(v27) = 2;
    ((void (__thiscall *)(int (__thiscall ***)(void *, char)))v21[1])(&v21);
    v4 = new(52);
    v23 = v4;
    LOBYTE(v27) = 3;
    if ( v4 )
      v7 = sub_005BC260(v4, v2, v25, (const void *)v5);
    else
      v7 = 0;
    if ( LOBYTE(FMp.AMes.m.l) )
      delete((void *)v5);
    fclose(v3);
    return v7;
  }


То есть v7 тут - это, я так понимаю указатель на структуру _Txt_ (по терминологии HD мода).
Вернуться к началу

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

Re: H3API by RoseKavalier

Сообщение RoseKavalier » 28 июн 2020, 15:03

0x55C070 parses a NWC text file from both data folder and from within lod.
There is H3TextFile::Load(file_name) for text-type or H3TextTable::Load(file_name) for spreadsheet-type.

For the former (0x55C070), H3File::GetLines() should parse the file correctly into lines. [edit: unless there are line breaks in text]
Вернуться к началу

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

Re: H3API by RoseKavalier

Сообщение as239 » 28 июн 2020, 16:56

Цитата:
I fail to see why you're packaging this text file within your project instead of distributing it directly

Because fresh mod installs by hand, and one file for this is the most convenient option.
Вернуться к началу

Пред.След.

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

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

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