-
AlexSpl
имя: Александр
- Эксперт
-
- Сообщения: 5587
- Зарегистрирован: 17 сен 2010, 12:58
- Пол:
- Награды: 14
-
-
- Поблагодарили: 2185 раз.
|
AlexSpl » 09 май 2021, 12:09
Вопрос, на который нельзя ответить 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; }
|