Добавлен
Я, будучи не очень продвинутым мапмейкером, о мемхаке слышу впервые и заинтригован теми возможностями, которые ему приписывают, но пока не совсем(совсем не) понимаю, что это и как начать с ним работать.
Прочитал эту статью - www.hiveworkshop.com/threads/accessing-memory-from-the-script-it...
Может быть я просто тугодум, но в любом случае ничего из этой статьи я не усвоил.
Может кто-то разжевать и на пальцах объяснить/скинуть статью где это уже сделали?

Введи в поиск на сайте мемхак, чтобы посмотреть разные материалы про него. Вот основная тема, с которой следует всё начать xgm.guru/p/wc3/memoryhack
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
Похожие вопросы:

ответ
	//globals
	integer array VariousFramesAddresses
	constant integer GOLD_TEXTFRAME_ADDRESS_INDEX=1
	constant integer LUMBER_TEXTFRAME_ADDRESS_INDEX=2
	constant integer UPKEEP_TEXTFRAME_ADDRESS_INDEX=3
	constant integer SUPPLY_TEXTFRAME_ADDRESS_INDEX=4

//memhack init
	set pGetFrameTextAddress = GameDLL + 0x61C7B0
	
function GetFrameTextAddress takes string name, integer id returns integer
	return CallFastCallWith2Args(pGetFrameTextAddress, GetStringAddress(name), id)
endfunction

function GetResourceBarsAddresses takes nothing returns nothing
	local integer a=GetFrameTextAddress("ResourceBarGoldText",0)
	if a>0 then
		set VariousFramesAddresses[GOLD_TEXTFRAME_ADDRESS_INDEX]=a
	endif
	set a=GetFrameTextAddress("ResourceBarLumberText",0)
	if a>0 then
		set VariousFramesAddresses[LUMBER_TEXTFRAME_ADDRESS_INDEX]=a
	endif
	set a=GetFrameTextAddress("ResourceBarSupplyText",0)
	if a>0 then
		set VariousFramesAddresses[SUPPLY_TEXTFRAME_ADDRESS_INDEX]=a
	endif
	set a=GetFrameTextAddress("ResourceBarUpkeepText",0)
	if a>0 then
		set VariousFramesAddresses[UPKEEP_TEXTFRAME_ADDRESS_INDEX]=a
	endif
		
endfunction

call CallThisCallWith2Args(GameDLL+0x60CA10,VariousFramesAddresses[UPKEEP_TEXTFRAME_ADDRESS_INDEX],GetStringAddress("random str "+I2S(GetRandomInt(1,2000))))
ответ
вылетает при поиске имени переменной, возможно создаются строки из байт (ConvertString че-то там) неверным путём
ответ
DracoL1ch:
офсет 2589 *4 , я ж только что сказал
Всё, немного поковырявшись у меня получилось, нужно было еще (id * 4) еще раз умножить на 4. Теперь строки извлекает идеально.
Если кому-то интересно, выглядит это вот так:
	DWORD ReadPointer(DWORD addr)
	{
		return *(DWORD*)(addr);
	}

	DWORD GetJassContext(int id)
	{
		DWORD pJassEnvAddress = DWORD(GetModuleHandle(TEXT("Game.dll"))) + 0xADA848;
		return ReadPointer(ReadPointer(ReadPointer(ReadPointer(pJassEnvAddress) + 0x14) + 0x90) + id * 4);
	}

	DWORD GetStringTable()
	{
		DWORD pJassContext = GetJassContext(1);
		return ReadPointer(ReadPointer(pJassContext + 0x2874) + 0x8);
	}

	std::string from_jString(jString jstrHandle)
	{
		DWORD pStringTable = GetStringTable();
		const char* sptr = (const char*)ReadPointer(ReadPointer(pStringTable + ((jstrHandle * 4)*4) + 0x8) + 0x1C);
		return sptr;
	}
ответ
Ну содержимое у restore само собой разное, в детекте урона новый хук на выход, вам нужна функция загрузки библиотеки?
Это же дело над:

function LoadLibrary takes string nDllName returns integer
    if pLoadLibraryA == 0 then
        set pLoadLibraryA = GetModuleProcAddress("Kernel32.dll", "LoadLibraryA" )
    endif
    if pLoadLibraryA != 0 then
        return CallStdcallWith1Args(pLoadLibraryA,GetStringAddress(nDllName))
    endif
 
    return 0
endfunction

26
Принятый ответ
Введи в поиск на сайте мемхак, чтобы посмотреть разные материалы про него. Вот основная тема, с которой следует всё начать xgm.guru/p/wc3/memoryhack
Чтобы оставить комментарий, пожалуйста, войдите на сайт.