,

Хак на память Warcraft3

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


Просмотров: 48 968



» Лучшие комментарии


quq_CCCP #401 - 1 год назад 0
ClotPh, знаю точно что у лича есть функция свапа абилок, (механика взята от 'ANeg' - техника, пассивка механика,) она позволяет сменить одну абилку, другой. Про иконки хз, третья версия мх так и не опубликована, в текущей версии подобного не видел.
ClotPh #402 - 1 год назад 0
GetTriggerPlayerMouseX; takes nothing returns real
GetTriggerPlayerMouseY; takes nothing returns real
в 1.29 уже есть, прям по моему заказу, хорошо бы и в мх
awesomesk1ll #403 - 1 год назад (отредактировано ) 0
quq_CCCP:
ClotPh, знаю точно что у лича есть функция свапа абилок, (механика взята от 'ANeg' - техника, пассивка механика,) она позволяет сменить одну абилку, другой. Про иконки хз, третья версия мх так и не опубликована, в текущей версии подобного не видел.
Т.е. на гитхабе выложена не текущая? Почему нет? Контрибюторов нет вообще? Почему? Слишком высокий уровень входа?
quq_CCCP #404 - 1 год назад 0
awesomesk1ll, на гитхабе первый мх, второй приложен в теме с детектом урона, функции пока особо не обновлялись, кроме отдельных случаев.
Мемхак тоже, третью версию пока никто не выложил, есть желаение перебрать все и протестить + выложить все с подробным описанием, пожалуйста.
Разработчиков мх и функций для оного мало интересует распространение сей наработки...
DracoL1ch #405 - 1 год назад 0
Я единственный активный контрибутор
Китайцы подрубили ЛУА и ничего через варик больше не делают, используют лишь код для инжекта либы
Остальные не осилили или делают втихую
Времени нет обновлять, но изменений множество
quq_CCCP #406 - 1 год назад 2
DracoL1ch, С нетерпением ждемс...
ClotPh #407 - 1 год назад (отредактировано ) 0
прям заставляете самостоятельно хакером становиться =)
ClotPh #408 - 1 год назад 0
/////////
Чет все не могу понять, казалось, что это давно было, но нихрена
Патч 1.29 пока еще не поставлю, хочу именно через мх
Есть урон, нужно именно увеличить/уменьшить/аннулировать его, хоть на значение, хоть в процентах
Через инвул, отхил, еще один дамаг я могу, но это все "не православно" и каждый способ имеет некоторые недостатки, и не применим будет т. к. речь о идее героя, который постоянно будет переназначать величины получаемого и наносимого урона остальным героям на абсолютно любой получаемый ими урон, так что там ну никак не катит постоянно инвул давать и отхил делать с таймерами и доп. дамагами и т. п.
как через мх именно действительно увеличить/уменьшить/аннулировать значение урона
я вижу, что функции типа есть
но че они делают и как ими пользоваться - вот именно в их случае НИХРЕНА не понятно!
Clamp #409 - 1 год назад (отредактировано ) 0
ну никак не катит постоянно инвул давать и отхил делать с таймерами
С чего бы? Сделай универсальный метод и применяй, благо событие получения урона любым юнитом легко реализуемо.

Китайцы подрубили ЛУА и ничего через варик больше не делают
Можно поподробнее на этот счёт?
ClotPh #410 - 1 год назад 0
Clamp, ну даже если на производительность критично не повлияет, все равно это не оч правильно, там будет не один усиленный урон, а один большой и еще один маленький, и это все надо везде учитывать
В идеале должно быть все-таки, чтобы именно урон менялся
quq_CCCP #412 - 1 год назад 0
ClotPh, Там есть пару детектов урона на мемхаке, но первый ресурсоемкий, это присоска на глобальное событие виджит получил урон внутри движка и работа со всеми параметрами пока не сработали триггерны на урон, второй вариант - попроще но там только чтение всех параметро а не запись ну и пошустрее будет.
DracoL1ch #413 - 1 год назад (отредактировано ) 2
function SetGetEventDamage takes real r returns nothing
	local integer a=CallThisCallWith1Args(GameDLL+0x3C1D40,0)
	if a!=0 then
		set a=CallThisCallWith1Args(GameDLL+0x3C1D60,0)
		if a!=0 then
			call WMem(a+0x30,mR2I(r))
		endif
	endif
endfunction
ClotPh #414 - 1 год назад 0
DracoL1ch, огромное спасибо, если что - отпишусь, но вроде все понятно
quq_CCCP #415 - 1 год назад 0
Clamp:
ну никак не катит постоянно инвул давать и отхил делать с таймерами
С чего бы? Сделай универсальный метод и применяй, благо событие получения урона любым юнитом легко реализуемо.

Китайцы подрубили ЛУА и ничего через варик больше не делают
Можно поподробнее на этот счёт?
Ну есть китайская версия мемхака, она работает на всех патчей в отличии от нашей, но там сам хак запускается в потоке ИИ и подгружает дллку, все остальные функции мемхака реализованы через пару АИ нативок котрые берут строку, в строку пишется имя функции, через глобалку или другие аркументы передаются параметры, дллка перехватывает некоторые функции и делает некоторые действия, в самом китайском редакторе все это дело зашито так как в jngp v или c JASS, т.е выглядит как нативка, а потом интерпритируется при сохранении..
quq_CCCP #416 - 1 год назад (отредактировано ) 2
функции для работы с сайленсом, позволяют задать разные типы сайленса (от обычного безмолвия, то паузы, когда способности скрываются с карты комманд)

    set pAddSilenceOnAbility=GameDLL+0x052B60 // оффсет для 1.26
    set pRemoveSilenceFromAbility=GameDLL+0x052BC0 // оффсет для 1.26

	set pAddSilenceOnAbility = GameDLL + 0x3E9FA0 // оффсет для 1.27
    set pRemoveSilenceFromAbility = GameDLL + 0x3EE3C0 // оффсет для 1.27


    function AddSilenceToAbility takes integer a returns nothing
        if a > 0 then
            call CallThisCallWith3Args( pAddSilenceOnAbility, a, 0, 1 )
 //0 for hide, 1 for silence 
        endif
    endfunction
    
    function RemoveSilenceFromAbility takes integer a returns nothing
        if a > 0 then
            call CallThisCallWith3Args( pRemoveSilenceFromAbility, a, 0, 1 )
        endif
    endfunction
 
    function AddSilenceHideToAbility takes integer a returns nothing
        if a > 0 then
            call CallThisCallWith3Args( pAddSilenceOnAbility, a, 1, 1 )
        endif
    endfunction
 
    function RemoveSilenceHideFromAbility takes integer a returns nothing
        if a > 0 then
            call CallThisCallWith3Args( pRemoveSilenceFromAbility, a, 1, 1 )
        endif
    endfunction
ClotPh #417 - 1 год назад 0
quq_CCCP, смертью, диспелами, морфами такие сайленсы сбрасываются?
quq_CCCP #418 - 1 год назад 2
ClotPh, нет, для этого нужно пилить триггер который за этим всем следит, у способностей за этим следит бафф - который и есть триггер, но внутригровой + имеющий доступ ко всем событиям движка.
DracoL1ch #419 - 1 год назад 2
любое событие имеет колбек, у способностей есть колбеки практически на всё, так и обеспечивается диспел при смерти, например. А тут всё вручную, но это и не для простого тыканья.
ClotPh #420 - 1 год назад 0
quq_CCCP, ну так это и хорошо, что нет, ок.
А способности патруля, атаки, движения и т. п. так можно "засайленсить"?
И если да, то при засайленсивании движения что будет и что вернет при запросе к скорости юнита?
quq_CCCP #421 - 1 год назад 2
ClotPh, можно, что бывает при паузе? Ну там сало, текущий приказ будет выполнятся новый не отдать. Кнопки заблочены.
ClotPh #422 - 1 год назад 0
Так-так-так! А пассивную способность засайленсить можно, чтобы она действовать перестала?
Просто думаю про сильвер эдж... офк все равно триггерно придется кое-что с триг пассивками делать, но все же
DracoL1ch #423 - 1 год назад 2
каждая абилка реализует реакцию на сайленс индивидуально
ClotPh #424 - 1 год назад 0
DracoL1ch, хм, ладно, тогда лучше, как и планировалось буду по полю выучивания определять пассивки атакованного через то, что у них кд = 0 и все дизейблить для игрока, по истечению действия эджа енейблить обратно
только еще для триггерных оговорки в их триггерах сделать
DracoL1ch #425 - 1 год назад 3

function GetAbilityBaseID takes integer a returns integer
	return RMem(RMem(a+0x54)+0x30)
endfunction

function IsAbilityUsable takes integer a returns boolean
	return CallThisCallWith1Args(RMem(RMem(a)+0x1D8),a)==1 or (RMem(a+0x6C)!=0 and GetAbilityBaseID(a)=='ANcl')
	//always false for ANcl
endfunction
quq_CCCP #426 - 1 год назад 0
DracoL1ch, полезная функция.
ClotPh #427 - 1 год назад 2
А можно через мх переименовать конкретную боевую единицу (примем, что пока не героя), оставив всем остальным и вновь создаваемым единицам того же типа обычное имя?
Например, у всех бугаев при выделении название "Бугай", а у конкретного заменить его на "Пеликан".
nvc123 #428 - 1 год назад 2
ClotPh, мх даёт прямой доступ к памяти
так что через него можно сделать всё что угодно
надо только найти нужные участки памяти и записать в них правильные данные
DracoL1ch #429 - 1 год назад 2
имена юнитов берутся через GetObjectName, так что только если совместишь с событиями выделениями или хуков своих напишешь
ScorpioT1000 #430 - 1 год назад 2
В 1.29 ptr есть SetUnitName, так что имя для каждого юнита лежит в отдельном участке памяти. Ну или они это сделали только в 1.29 ptr
DracoL1ch #431 - 1 год назад 0
Чем докажешь? глобально имя меняется
ScorpioT1000 #432 - 1 год назад (отредактировано ) 0
Или ты о том, что передаем мы конкретного юнита, а имя меняется для типа юнита?
DracoL1ch #433 - 1 год назад (отредактировано ) 0
так лениво было второго юнита такого же создать рядом?) именно
pro100master #434 - 1 год назад 0
DracoL1ch, он правда пишет... я тестировал можно создать тот же юнит но на разных именах... а вот предмет накосячили что все предметы заменяет если 1 предмет выбрано
ScorpioT1000 #435 - 1 год назад 0
Функция бы тип принимала, они же не совсем конченные. Если надо что-то сделать, какой смысл брать у юнита тип и делать что-то с ним, если можно просто передать тип.
DracoL1ch #436 - 1 год назад 2
А, вижу SetUnitNameAll, окей. Многие новые нативки принимают именно объект, а не ID, чтобы проверять тип
ClotPh #437 - 1 год назад 0
ну значит по идее же и через мх так можно
ScorpioT1000 #438 - 1 год назад 0
А векторы данных юнита уже определены? Он ведь по идее не такой тяжеловесный должен быть
DracoL1ch #439 - 1 год назад (отредактировано ) 0
"по-идее" никак не связано с реальностью, они явно поменяли алгоритм подгрузки имени юнита, чтобы учитывать таких одиночек, поэтому наверняка без хука не обойтись, а с хуком можно и сейчсас самим, было бы желание
Сложного нет, просто муторно - имя востребовано в ряде игровых инстансов, но реально важны только GetUnitName, рендерер панели и рендерер окна героев, т.е. от 3 хуков + какой-то костыль для указания, кто как зовется, скорее всего - отдельная хештаблица, чтобы с хендлом работать
а что с векторами?
ClotPh #440 - 11 месяцев назад 0
////
подсказали, что мемхаком можно триггерно приказать открыть спеллбук, укажите плз функцию
Steal nerves #441 - 11 месяцев назад (отредактировано ) 0
а можно ли узнать текущую дальность обзора юнита? или как-то на обзор юнита влиять (подзорная труба не в счет, так как ограничение в 1800)
Hate #442 - 11 месяцев назад 1
Steal nerves:
а можно ли узнать текущую дальность обзора юнита? или как-то на обзор юнита влиять (подзорная труба не в счет, так как ограничение в 1800)
делаешь абилки на основе "предмет: увеличение поля зрения" с разным количеством прибавляемого обзора
затем делаешь нужному юниту/юнитам минимальный нужный обзор в РО
а после уже функцией можно добавлять нужную абилку изменяя тем самым дальность обзора
по крайней мере я нашел лишь такой стандартный способ
прикреплены файлы
quq_CCCP #443 - 11 месяцев назад 2
ClotPh, пример лежит в скиллах с конкурса - ссыль
Кароче мою карту смотри, там есть коменты что как и зачем.
ClotPh #444 - 11 месяцев назад 2
/
Продублирую тут
/////
Блин, ну перепишите плз функцию GetUnitBaseDamage (и, ятп, GetUnitGreenBonusDamage), чтобы при отсутствии атаки она не варкрафт фаталила, а возвращала 0! Ну что это такое, второй раз уже из-за нее фаталы!
Можно и нужно офк фильтры и проверки ставить, но по-нормальному они внутри самой функции должны быть!
///////
Пока придется всем осязаемым юнитам давать атаку, а у кого ее не должно быть - склад орков совать... потому что при первой попытке подсчета атаки с у кого ее нет фатал сразу, а лучше бы, чтобы возвращало 0 и все
/////
Вообще стоит определиться: развивается мемхак параллельно "официальной линии" или нет, если да, то надо вот все вот такие фаталы исправлять, идеализировать функции, а если они уже есть в кул вариантах, то обновить ссылки выше.
В идеале, если развитие идет, вообще мемхак вывести в дополнительный гуи и прямо внутрь вшить O_O, слова нельзя я не понимаю.
ScorpioT1000 #445 - 11 месяцев назад 0
Жалко, нет function_exists и объявлений на ходу)
DracoL1ch #446 - 11 месяцев назад 6
function_exists - это что за зверь?
фаталов в мх нет, фаталы есть у тех, кто использует его на своих картах без учета собственных же особенностей разработки. Ну а поставить хотя бы тупо проверку на ноль в ответе не так сложно, полагал я в прошлом
ScorpioT1000 #447 - 11 месяцев назад 0
Ну типа чтобы polyfill делать
if not function_exists("GetMouseX") then
    function GetMouseX takes nothing returns float
        // ...
    endfunction
endif
Msey #448 - 11 месяцев назад 0
ScorpioT1000:
Ну типа чтобы polyfill делать
if not function_exists("GetMouseX") then
    function GetMouseX takes nothing returns float
        // ...
    endfunction
endif
типа рефлексии?
DracoL1ch #449 - 11 месяцев назад 0
Это вообще уже что-то из редактора и к мх не имеющее отношения
JMacTep #450 - 11 месяцев назад 0
ScorpioT1000, вроде есть к обращении к библиотеку например if not LIBRARY_name then а функция хз