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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
32
7 лет назад
Отредактирован quq_CCCP
0
Думаю все в курсе что GetUnitAbilityForAddresss довольно медленная функция ( по тестам лича в 15 раз медленее чем GetUnitAbilityLevel )
По этому стоит проверять наличие аблики у цели по GetUnitAbilityLevel а так же заносить результаты в хештаблицу или массив для более быстрой работы.
Поэтому вот 1 из вариантов оптимизации:
код
function GetUnitAbilityForAddresss takes integer pConvertedHandle, integer abilid returns integer
        local integer pAddr1 = pConvertedHandle + 476
        local integer pAddr2 = pConvertedHandle + 480
        local integer pOff1 = LoadInteger( gg_htb_HashData, abilid, pConvertedHandle )
        
        if pOff1 > 1 then
            call BJDebugMsg("Значение уже записано!")
            return pOff1
        endif
        

        set pAddr1 = Memory[pAddr1 / 4]
        set pAddr2 = Memory[pAddr2 / 4]
        
        if pAddr1 == 0 or pAddr2 == 0 or BitwiseAnd( pAddr1, pAddr2 ) == -1 then
            return 0
        endif
        
        set pOff1 = GetSomeAddressForAbility( pAddr1, pAddr2 )
        if pOff1 == 0 then
            return 0
        endif
        
        loop
            exitwhen pOff1 == 0
            if Memory[pOff1 / 4 + 52 / 4] == abilid then
                call SaveInteger( gg_htb_HashData, abilid, pConvertedHandle, pOff1 )
                return pOff1
            endif
            
            set pOff1 = GetSomeAddressForAbility( Memory[pOff1 / 4 + 36 / 4], Memory[pOff1 / 4 + 40 / 4] )
        endloop
        
        return pOff1
    endfunction
BaHeK, Щяс проверил твою функцию, фатал...
2
6
7 лет назад
2
У меня 1.27 если что.
0
32
7 лет назад
0
BaHeK:
У меня 1.27 если что.
У меня 1.26, но не вижу переключателя на другие патчи у тебя в функции.
2
6
7 лет назад
2
quq_CCCP, в таком случае мне нужно будет установить 2 варика с разными версиями, но такой возможности у меня нет. Так что только 1.27.
1
24
7 лет назад
1
quq_CCCP, хеш таблицы сами по себе медленнее хромого коня, или они все таки перегоняют эту функцию в скорости?
2
32
7 лет назад
2
darkowlom:
quq_CCCP, хеш таблицы сами по себе медленнее хромого коня, или они все таки перегоняют эту функцию в скорости?
Ну вот как раз хештаблицы то не медленные, а быстрее чем каждый раз искать, да и это грубый пример оптимизации, как будто вы забыли про системы хранения данных на массивах?
0
24
7 лет назад
0
quq_CCCP, я просто пробовал через хештаблицу передавать данные в внешнюю длл, так как из внешней получить данные массива сложно, скорость передачи была далеко не лучшей - отсюда и вопрос
0
13
7 лет назад
Отредактирован ENAleksey
0
darkowlom, передачу данных можно реализовать с помощью экспортируемых функций в dll.
__declspec(dllexport) unsigned int __stdcall SendValueToDll(int key, int value)
{
	// Сохраняем полученные значения
	return true;
}
И в карте:
function SendValueToDll takes integer key, integer value returns integer
    local integer hHandle = GetModuleProcAddress("MyDll.dll", "SendValueToDll")
    if hHandle != 0 then 
        return CallStdcallWith2Args(hHandle, key, value)
    endif 
    return 0
endfunction
0
29
7 лет назад
0
чет полная жесть уже начинает с этой штуковиной :(
страшно становится после этого запускать. А то еще вирусняки начнет качать. Интересно было бы почитать как эта штука работает
в гите и на хайве не удалось увидеть
2
13
7 лет назад
2
Интересно было бы почитать как эта штука работает
Только в новой версии добавили возможность разблокировать память на запись. И на гитхабе есть описания к функциям.
0
32
7 лет назад
0
alexprey:
чет полная жесть уже начинает с этой штуковиной :(
страшно становится после этого запускать. А то еще вирусняки начнет качать. Интересно было бы почитать как эта штука работает
в гите и на хайве не удалось увидеть
Кстати там есть функции создания файла на машине юзера и открывания ссылки в браузере, а так же сколачивание с указанного сайта указанного файла на пк юзера (юзается для обновление версии карты у лича)
Очень даже можно загнать читерам, ломающим карты вирус позлее вроде Neshta чтобы потом мучились.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.