Объявления

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

H3API by RoseKavalier

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

Re: H3API by RoseKavalier

Сообщение as239 » 03 май 2021, 18:04

Вариант, с неиспользуемыми, я анализировал - по сути, полноценных таких полей нет, и есть высокий шанс поломать оригинальные алгоритмы.

Я думал, что можно в момент создания структуры , увеличить ее размер и таким образом, поля в конце структуры можно будет использовать для себя.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5539
Зарегистрирован: 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 » 03 май 2021, 18:09

Цитата:
Я думал, что можно в момент создания структуры , увеличить ее размер и таким образом, поля в конце структуры можно будет использовать для себя.

Так можно сделать, но Вам придётся пройтись по коду и поменять размер структуры на новый. Например, размер _Town_ 360 байт, нужно везде заменить этот размер на новый, чтобы работало (плюс не забыть конструкторы, в которых выделяется память).

Например, если в оригинальном коде используется sizeof() или сложение указателей, то одного только выделения большего кол-ва байт под размер структуры будет недостаточно. Это компилятор всё пересчитает, а в коде игры, естественно, останутся старые значения.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5539
Зарегистрирован: 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 » 03 май 2021, 18:46

Насчёт полноценных полей. Если у Вас есть 4 байта, то Вы можете уместить указатель на любую кастомную структуру (естественно, поддерживать её должны будете самостоятельно):

int* unused => yourStructureType* yourStructure

Обращение к полям yourStructure: unused->yourStructure.anyField. Здесь потребуется хукнуть конструктор, чтобы выделить память под Вашу yourStructure, и не забыть освободить память в деструкторе, зато в этом случае остальной код менять не придётся.

1. Глобально в плагине определяете структуру:

struct yourStructure {
// с произвольным набором полей
};

2. Хукаете конструктор.
3. Хукаете деструктор.

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

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

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

Re: H3API by RoseKavalier

Сообщение RoseKavalier » 03 май 2021, 21:59

Extending structures is only something you should do if you do a complete takeover of an entire code portion that covers all of the use cases: not only will it take roughly the same amount of time, but you'd also get much greater control over everything.

For your purposes, global variables to which you tie the current map is well suited. Hook the map's destructor and delete your associated global data at the same time. These can be stored in a std::map<int, ExtraMapData> where int is simply the address of the map you are using (cast to integer).
Вернуться к началу

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

Re: H3API by RoseKavalier

Сообщение as239 » 04 май 2021, 09:27

std::map with multiple reads and searches, is significantly slower than direct memory access.
Found an existing byte that can be used, 8 flags is more than enough for me.
Вернуться к началу

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

Re: H3API by RoseKavalier

Сообщение RoseKavalier » 04 май 2021, 14:21

Really depends on how much data you have to store, if you need only 8 bits then it's not an issue to store it within without extending the structure.

std::map<int, T> is pretty fast since integer comparison a single operation; you'd only have a few extra allocations for nodes. Not so much different than storing in a vector and doing one-by-one comparison.
Вернуться к началу

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

Re: H3API by RoseKavalier

Сообщение void_17 » 09 май 2021, 11:32

Почему при подключении H3API выдает кучу ошибок?
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5539
Зарегистрирован: 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 » 09 май 2021, 12:09

Вопрос, на который нельзя ответить :smile2: H3API, во-первых, меняется, это живой проект. Во-вторых, причиной ошибок может быть версия Visual Studio и т.п.

Вот пример работающего плагина с использованием H3API (ещё без single header):

Код: Выделить всё
#define _H3API_PATCHER_X86_
#include "..\..\H3API\H3API.hpp"

Patcher* _P;
PatcherInstance* _PI;
const char* PLUGIN_NAME = "HD.Plugin.TestH3API";

using namespace h3;

int __stdcall AIGetCastSpellValue(HiHook* hook, H3QuickBattleCreatures* battleStack, H3AIBattleSpell* spell, H3Hero* DHero, H3Hero* AHero)
{
    static int testNumber = 0;
       
    // Original function
    int OriginalValue = THISCALL_4(int, hook->GetDefaultFunc(), battleStack, spell, DHero, AHero);
       
    // Function to check
    int ValueToCheck = 0;
    double spellDamagePercentage;
    if ( battleStack->stackPower )
    {
        int spellDuration = spell->spellDuration;
        if ( spellDuration > 5 ) spellDuration = 5;
        spellDamagePercentage = FASTCALL_4(double, 0x44A1A0, spell->spellId, battleStack->type, DHero, AHero);
        ValueToCheck = (int)(battleStack->stackPower * spellDuration * P_Spell(spell->spellId).ai_value[spell->skillLevel] * spellDamagePercentage / 500.0);
    }

    // if ( ValueToCheck != OriginalValue )
    if ( ++testNumber <= 200 )
    {
        sprintf(h3_TextBuffer, "Test #%d\n\nOriginalValue = %d\nValueToCheck = %d\n\nstackPower = %d\nspellDuration = %d\nspellAIValue = %d\nspellDamage%% = %f",
            testNumber, OriginalValue, ValueToCheck, battleStack->stackPower, spell->spellDuration, P_Spell(spell->spellId).ai_value[spell->skillLevel], spellDamagePercentage);

        F_MessageBox();
    }
   
    return OriginalValue;
}

int __stdcall showArgs(LoHook* h, HookContext* c)
{
    sprintf(h3_TextBuffer, "%08X %08X %08X %08X %08X", c->esi, c->edi, c->ecx, c->eax, c->edx);
    F_MessageBox();
    return EXEC_DEFAULT;
}

int __stdcall skipTurns(LoHook* h, HookContext* c)
{
    int i, result, a1, a2, a3, a4, a5;

    a1 = c->ecx;
    a2 = c->edi;
    a3 = c->ebp - 1;
    a4 = c->eax;
    a5 = c->edx;
   
    for (i = 1; i <= 5; ++i) {
        if ( !*(int*)0x69CCF4 ) {
            c->eax = THISCALL_5(int, 0x4099D0, a1, a2, a3, a4, a5);
            sprintf(h3_TextBuffer, "%d", i);
            F_MessageBox();
        }
    }
   
    c->return_address = 0x408999;
    return NO_EXEC_DEFAULT;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    if ( DLL_PROCESS_ATTACH == ul_reason_for_call )
    {
        _P = GetPatcher();
        _PI = _P->CreateInstance(PLUGIN_NAME);
        // _PI->WriteHiHook(0x423C80, SPLICE_, EXTENDED_, THISCALL_, AIGetCastSpellValue);
        // _PI->WriteLoHook(0x408992, showArgs);
        _PI->WriteLoHook(0x408994, skipTurns);
    }

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

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

Re: H3API by RoseKavalier

Сообщение void_17 » 30 май 2021, 13:56

Недавно Visual Studio сошёл с ума и начал выдавать уж очень странные ошибки. До этого подобных ошибок вообще не было, хоть и были проблемы с H3API. Для демонстрации сделал с нуля DLL, в котором просто подключил H3API, включил патчер H3API, все равно он ругается не пойми на что. Раньше такого не было.

Менял местами #include и #define, убирал некоторые, все равно эти странные ошибки появлились. Пробовал перезагружать, переустанавливать Visual Studio, ничего не помогло.
Изображение
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5539
Зарегистрирован: 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 » 30 май 2021, 14:01

Нужно #define _H3API_PATCHER_X86_ поднять вверх, я думаю. _bool_ - это тип, который определяется патчером, а не H3API.
Вернуться к началу

Пред.След.

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

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

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