Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
vJass
Тип:
Наработка
Версия Warcraft:
1.26 и ниже
Собственно тот знаменитый хак на память который нам радостно предоставил DracoL1ch, который позволяет нам больше не морочится с системами отлова урона, или вовсе узнать координаты курсора без стороннего по.
Для сохранения требуется: экспериментальная версия pjass.exe
Причём не все подходят, меньше всего проблем было с этой версией
В хаке присутствует только 1 пример на изменение белой атаки у героя, остальные готовые функции можно найти на:
Хайве
Гитхабе
Просто копируем саму функцию, все остальное для её работы есть в наработке и сохраняем.
Так же на хайве есть инструкция по созданию собственных функций для чтения\изменения данных в памяти игры.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
2
16
6 лет назад
2
ты в неё передаешь size, убедись что он достаточен (60к)
0
27
6 лет назад
0
DracoL1ch, не понимаю. у меня что-то не работает =( вылетает ^_^
вот карта
Загруженные файлы
6
16
6 лет назад
Отредактирован DracoL1ch
6
потому что у тебя вообще нет инита функций мемхака
которые включают в себя AllocateExecutableMemory
set pCallFastCallWith1Args=AllocateExecutableMemory(64000)
	
	set Memory[pCallFastCallWith1Args/4]=0

	set pCallFastCallWith2Args=pCallFastCallWith1Args + 1000
	set Memory[pCallFastCallWith2Args/4]=0
вот это всё
2
27
6 лет назад
2
DracoL1ch, короче понял
так понимаю, на пассивках это работать не будет. критует.
вот сделал систему когда прибавляет при убийстве blademaster-ом
Загруженные файлы
0
21
6 лет назад
0
Steal nerves, в принципе можно псевдопассивку с кд 0 сделать на основе виндволка... а во всех триггерах активки с кд < 1 не учитывать, у меня они уже практически нигде такие не учитываются
4
16
6 лет назад
4
Эм, ну да, на пассивках не тестил, ибо в этом плане сломанные Afla проще
Там просто нет этой функции на пассивках вообще, ясно откуда вылет.
фикс под пассивки
по крайней мере часть пассивок
function InitCustomChargesData takes nothing returns nothing
	set ChargesIndicatorDataHandle=GetHandleId(ChargesIndicatorData)
	set Memory[pCustomChargesDisplayer/4 + 0] = 0x0824448B
	set Memory[pCustomChargesDisplayer/4 + 1] = 0x7C8B5756
	set Memory[pCustomChargesDisplayer/4 + 2] = 0x57500C24
	set Memory[pCustomChargesDisplayer/4 + 3] = 0x8DE8F18B
	set Memory[pCustomChargesDisplayer/4 + 4] = 0x85000372
	call WMem(pCustomChargesDisplayer+4*3 + 3,GameDLL+0x378A0 - (pCustomChargesDisplayer+4*3 + 3) - 4)
	set Memory[pCustomChargesDisplayer/4 + 5] = 0x397C75FF
	set Memory[pCustomChargesDisplayer/4 + 6] = 0x777F407E
	set Memory[pCustomChargesDisplayer/4 + 7] = 0x51605E5F
	set Memory[pCustomChargesDisplayer/4 + 8] = 0x4E8B9090
	set Memory[pCustomChargesDisplayer/4 + 9] = 0xCC40B830
	set Memory[pCustomChargesDisplayer/4 + 10] = 0xD0FF6F2D
	call WMem(pCustomChargesDisplayer+4*9 + 2,GameDLL+0x2DCC40)
	set Memory[pCustomChargesDisplayer/4 + 11] = 0x6974C085
	set Memory[pCustomChargesDisplayer/4 + 12] = 0x8B905159
	set Memory[pCustomChargesDisplayer/4 + 13] = 0x3476FFD8
	set Memory[pCustomChargesDisplayer/4 + 14] = 0x99996850
	set Memory[pCustomChargesDisplayer/4 + 15] = 0x10B89999
	call WMem(pCustomChargesDisplayer+4*14 + 2,ChargesIndicatorDataHandle)
	set Memory[pCustomChargesDisplayer/4 + 16] = 0xFF6F3CAB
	call WMem(pCustomChargesDisplayer+4*15 + 3,GameDLL+0x3CAB10)
	set Memory[pCustomChargesDisplayer/4 + 17] = 0x0CC483D0
	set Memory[pCustomChargesDisplayer/4 + 18] = 0x4C74C085
	set Memory[pCustomChargesDisplayer/4 + 19] = 0x90905990
	set Memory[pCustomChargesDisplayer/4 + 20] = 0x828B168B
	set Memory[pCustomChargesDisplayer/4 + 21] = 0x00000308
	set Memory[pCustomChargesDisplayer/4 + 22] = 0x53347E8B
	set Memory[pCustomChargesDisplayer/4 + 23] = 0xD0FFCE8B
	set Memory[pCustomChargesDisplayer/4 + 24] = 0x533476FF
	set Memory[pCustomChargesDisplayer/4 + 25] = 0x99999968
	set Memory[pCustomChargesDisplayer/4 + 26] = 0xB8D88B99
	call WMem(pCustomChargesDisplayer+4*25 + 1,ChargesIndicatorDataHandle)
	set Memory[pCustomChargesDisplayer/4 + 27] = 0x6F3CAA90
	call WMem(pCustomChargesDisplayer+4*27 + 0,GameDLL+0x3CAA90)
	set Memory[pCustomChargesDisplayer/4 + 28] = 0xC483D0FF
	set Memory[pCustomChargesDisplayer/4 + 29] = 0x51C88B0C
	set Memory[pCustomChargesDisplayer/4 + 30] = 0xCF8BD38B
	set Memory[pCustomChargesDisplayer/4 + 31] = 0x332E10B8
	set Memory[pCustomChargesDisplayer/4 + 32] = 0x6AD0FF6F
	call WMem(pCustomChargesDisplayer+4*31 + 1,GameDLL+0x332E10)
	set Memory[pCustomChargesDisplayer/4 + 33] = 0x8BD38B01
	set Memory[pCustomChargesDisplayer/4 + 34] = 0x2E40B8CF
	set Memory[pCustomChargesDisplayer/4 + 35] = 0xD0FF6F33
	call WMem(pCustomChargesDisplayer+4*34 + 2,GameDLL+0x332E40)
	set Memory[pCustomChargesDisplayer/4 + 36] = 0x5F07EB5B
	set Memory[pCustomChargesDisplayer/4 + 37] = 0x0008C25E
	set Memory[pCustomChargesDisplayer/4 + 38] = 0xC2615990
	set Memory[pCustomChargesDisplayer/4 + 39] = 0x90900008
//	call echo(Int2Hex(pCustomChargesDisplayer))

set Memory[pCustomChargesDisplayer/4 + 40] = 0x0824448B
	set Memory[pCustomChargesDisplayer/4 + 41] = 0x7C8B5756
	set Memory[pCustomChargesDisplayer/4 + 42] = 0x57500C24
	set Memory[pCustomChargesDisplayer/4 + 43] = 0x8390F18B
	set Memory[pCustomChargesDisplayer/4 + 44] = 0x859008C4
	set Memory[pCustomChargesDisplayer/4 + 45] = 0x397C75FF
	set Memory[pCustomChargesDisplayer/4 + 46] = 0x777F407E
	set Memory[pCustomChargesDisplayer/4 + 47] = 0x51605E5F
	set Memory[pCustomChargesDisplayer/4 + 48] = 0x4E8B9090
	set Memory[pCustomChargesDisplayer/4 + 49] = 0xCC40B830
	set Memory[pCustomChargesDisplayer/4 + 50] = 0xD0FF6F2D
	call WMem(pCustomChargesDisplayer+4*49 + 2,GameDLL+0x2DCC40)
	set Memory[pCustomChargesDisplayer/4 + 51] = 0x6974C085
	set Memory[pCustomChargesDisplayer/4 + 52] = 0x8B905159
	set Memory[pCustomChargesDisplayer/4 + 53] = 0x3476FFD8
	set Memory[pCustomChargesDisplayer/4 + 54] = 0x99996850
	set Memory[pCustomChargesDisplayer/4 + 55] = 0x10B89999
	call WMem(pCustomChargesDisplayer+4*54 + 2,ChargesIndicatorDataHandle)
	set Memory[pCustomChargesDisplayer/4 + 56] = 0xFF6F3CAB
	call WMem(pCustomChargesDisplayer+4*55 + 3,GameDLL+0x3CAB10)
	set Memory[pCustomChargesDisplayer/4 + 57] = 0x0CC483D0
	set Memory[pCustomChargesDisplayer/4 + 58] = 0x4C74C085
	set Memory[pCustomChargesDisplayer/4 + 59] = 0x90905990
	set Memory[pCustomChargesDisplayer/4 + 60] = 0x828B168B
	set Memory[pCustomChargesDisplayer/4 + 61] = 0x00000308
	set Memory[pCustomChargesDisplayer/4 + 62] = 0x53347E8B
	set Memory[pCustomChargesDisplayer/4 + 63] = 0xD0FFCE8B
	set Memory[pCustomChargesDisplayer/4 + 64] = 0x533476FF
	set Memory[pCustomChargesDisplayer/4 + 65] = 0x99999968
	set Memory[pCustomChargesDisplayer/4 + 66] = 0xB8D88B99
	call WMem(pCustomChargesDisplayer+4*65 + 1,ChargesIndicatorDataHandle)
	set Memory[pCustomChargesDisplayer/4 + 67] = 0x6F3CAA90
	call WMem(pCustomChargesDisplayer+4*67 + 0,GameDLL+0x3CAA90)
	set Memory[pCustomChargesDisplayer/4 + 68] = 0xC483D0FF
	set Memory[pCustomChargesDisplayer/4 + 69] = 0x51C88B0C
	set Memory[pCustomChargesDisplayer/4 + 70] = 0xCF8BD38B
	set Memory[pCustomChargesDisplayer/4 + 71] = 0x332E10B8
	set Memory[pCustomChargesDisplayer/4 + 72] = 0x6AD0FF6F
	call WMem(pCustomChargesDisplayer+4*71 + 1,GameDLL+0x332E10)
	set Memory[pCustomChargesDisplayer/4 + 73] = 0x8BD38B01
	set Memory[pCustomChargesDisplayer/4 + 74] = 0x2E40B8CF
	set Memory[pCustomChargesDisplayer/4 + 75] = 0xD0FF6F33
	call WMem(pCustomChargesDisplayer+4*74 + 2,GameDLL+0x332E40)
	set Memory[pCustomChargesDisplayer/4 + 76] = 0x5F07EB5B
	set Memory[pCustomChargesDisplayer/4 + 77] = 0x0008C25E
	set Memory[pCustomChargesDisplayer/4 + 78] = 0xC2615990
	set Memory[pCustomChargesDisplayer/4 + 79] = 0x90900008
endfunction

function VisualChargesSystem_InitHookOnAbility takes unit u, integer id returns nothing
	local integer a
	local integer b
	set a=GetUnitAbility(u,id)
	if a!=0 then
		if RMem(RMem(a)+0x1C4)==GameDLL+0x378A0 then
			call SaveUnlockWriteMemory(RMem(a)+0x1C4,pCustomChargesDisplayer,true,true)
		elseif RMem(RMem(a)+0x1C4)==GameDLL+0x20AF0 then
			call SaveUnlockWriteMemory(RMem(a)+0x1C4,pCustomChargesDisplayer+40*4,true,true)
		else
			call BJDebugMsg("Unknown base ability, hook is not possible")
		endif
	endif
endfunction
на выжег маны и уклонение работает, в случае чего плюнет ошибку и ниче не сделает.
0
21
5 лет назад
0
там, где AllocateExecutableMemory вызывается, указан объем выделяемой памяти
поставь туда 70000 и вперед, остальное набирай дальше
пример использования
А можно меньше 70000 сделать, если мне столько не нужно.
Внизу set pCustomChargesDisplayer = pCallFastCallWith1Args + 35000.
        set pCallFastCallWith1Args                      = AllocateExecutableMemory( 40000 )
        set pCallFastCallWith2Args                      = pCallFastCallWith1Args + 1000
        set pCallFastCallWith3Args                      = pCallFastCallWith1Args + 2000
        set pCallFastCallWith4Args                      = pCallFastCallWith1Args + 3000
        set pFUCKINGCallWith4Args                       = pCallFastCallWith1Args + 4000
        set pCallFastCallWith5Args                      = pCallFastCallWith1Args + 5000
        set pCallFastCallWith6Args                      = pCallFastCallWith1Args + 6000
        set pCallFastCallWith7Args                      = pCallFastCallWith1Args + 7000
        set pCallFastCallWith8Args                      = pCallFastCallWith1Args + 8000        
        set pCallStdcallWith1Args                       = pCallFastCallWith1Args + 9000
        set pCallStdcallWith2Args                       = pCallFastCallWith1Args + 10000
        set pCallStdcallWith3Args                       = pCallFastCallWith1Args + 11000
        set pCallStdcallWith4Args                       = pCallFastCallWith1Args + 12000
        set pCallStdcallWith5Args                       = pCallFastCallWith1Args + 13000
        set pCallStdcallWith6Args                       = pCallFastCallWith1Args + 14000        
        set pCallCdeclWith1Args                         = pCallFastCallWith1Args + 15000
        set pCallCdeclWith2Args                         = pCallFastCallWith1Args + 16000
        set pCallCdeclWith3Args                         = pCallFastCallWith1Args + 17000
        set pCallCdeclWith4Args                         = pCallFastCallWith1Args + 18000
        set pCallCdeclWith5Args                         = pCallFastCallWith1Args + 19000
        set pCallCdeclWith6Args                         = pCallFastCallWith1Args + 20000
    //  set pReadStack                                  = pCallFastCallWith1Args + 21000
        set pBitwiseOR_ExecutableMemory                 = pCallFastCallWith1Args + 22000
        set pBitwiseXOR_ExecutableMemory                = pCallFastCallWith1Args + 23000
        set pBitwiseAND_ExecutableMemory                = pCallFastCallWith1Args + 24000
        set pReservedMemoryForMissileHandler            = pCallFastCallWith1Args + 25000
    //  set pReservedMemoryForDamageHandler             = pCallFastCallWith1Args + 26000
        set pGetAbilityOrderID                          = pCallFastCallWith1Args + 27000
    //  set pReservedMemoryForPacketHandler             = pCallFastCallWith1Args + 28000
    //  set pReservedMemoryForPacketHandler2            = pCallFastCallWith1Args + 29000
        set pCallFastCallWith11Args                     = pCallFastCallWith1Args + 30000
        set pCallFastCallWith12Args                     = pCallFastCallWith1Args + 31000
    //  set pReservedMemoryForBerserkHook               = pCallFastCallWith1Args + 32000
    //  set pReservedMemoryForAttackPrepareHandler      = pCallFastCallWith1Args + 34000
        set pCustomChargesDisplayer                     = pCallFastCallWith1Args + 35000
0
21
5 лет назад
0
конечно понимаю что уже в который раз спрашиваю, но все-таки еще раз прошу уточнить насчет функции получения золотостоимости предмета
дико нужна для разных систем
ту замуту упоротую с созданием магазинов и продажи в них предметов и сверкой стоимости золота мне НЕ надо, потому что, во-первых, это правой рукой чесать левое ухо через голову, во-вторых, мне там в коде видятся утечки, т. е. еще и утечки править, а в итоге все равно не оптимальный вариант получается
бд это понятно через прочность или еще что у шмота или просто само по себе через переменные, но бд - тоже косой выход
так что очень прошу еще раз что там по функции просто подсчитать голдкост
типа function GetItemGoldCost takes item returns integer
чтобы принимала предмет и возвращала его цену
в этот раз сразу себе в "основной справочник" всю инфу скину, если получу точную информацию, в идеале готовую функцию, а не "наводку"
вот вроде была где-то полезная "наводка" на адрес, что ли, мб у меня получилось бы самостоятельно составить функцию, но ща я и этой "наводки" не могу отыскать, только вот тот изврат с магазинами продажей и сверкой золота а его не хочу, хочу мемхаком голдкост предмета получать
заранее благодарю
0
23
5 лет назад
0
ClotPh, а зачем мемхак если можете узнать сколько потратил например при продаже узнаем текуший монет и записиваем или за убиства записиваем все у игрока, при покупке сверяем данные и текуший монету и узнаете сколько стоит даже бд не надо
0
21
5 лет назад
0
JMCode, это все равно намного менее удобно + при продаже нужно еще "расходы" всякие учитывать
2
8
5 лет назад
2
Вот такой вопрос. Можно ли менять текстуру интерфейса во время игры?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.