When hovering with shift
>>0x40E9DE
>>c->eax = 2; // AMC_Hero
Yes, this is the idea. But how to change the cursor immediately when it's already over a hero? Also, it works for "meeting" cursor (8) only, I guess?
My idea is to set ecx = -1 here: 40E495h, thus imitating that there are no active heroes (like you clicked on town, for example). But the problem is that the cursor doesn't update immediately after you pressed Shift key. sub_0040E2C0 is only called when mouse coordinates are changed.
Первая попытка - Код: Выделить всё
#include "pch.h"
#include "..\HotA\homm3.h"
Patcher* _P;
PatcherInstance* _PI;
static _bool_ plugin_On = 0;
int __stdcall checkShift(LoHook* h, HookContext* c)
{
if ( GetAsyncKeyState(VK_SHIFT) & 0x8000 ) {
c->return_address = 0x40A985;
return NO_EXEC_DEFAULT;
}
return EXEC_DEFAULT;
}
int __stdcall changeCursor(LoHook* h, HookContext* c)
{
if (GetAsyncKeyState(VK_SHIFT) & 0x8000) {
c->ecx = -1;
}
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.ShiftClick");
_PI->WriteLoHook(0x40A7C7, checkShift);
_PI->WriteLoHook(0x40E495, changeCursor);
}
}
return TRUE;
}
Дополнительным хуком можно чуть подправить положение: достаточно, чтобы курсор сместился всего на один пиксель, а не на целую клетку, но его у меня под рукой нет. Всё равно существуют две описанные выше проблемы, так что всё равно. Нужно подходить к этой задаче серьёзней