Ige, нетак, фигню написал...
Методом тыка вам тут только фаталы ловить, нужен Cheat Engine и познание структуры триггеров, покуда у вас этого нету, можно не старатся, у драколича ушело на это больше года...
Пишите личу про смену урона, только он колупал и проверял это, возможно что урон вовсе не сменить с уровня jass. pro100master, Нужно еще понимать как там устроена структура и где прилеплен код к событию...
Ige, причем тут броня?
Чего за глупость, ты получаешь начальный урон до брони set DamageValues[DamageIncrementer]=mI2R(Memory[offset/4+0x10/4])//RMem(offset+0x10))
И GetEventDamage после, дальше в потоке триггера работай с юнитами как хочешь, зачем тебе адресса?
Ты дальше работаешь с юнитами в триггере, ненадо никаких конвертов юнитов, не говоря о том что это медленно, CallFastCallWith2Args(pGetUnitForAddress, addr, 0) заставляет игру выполнить внутринний алгоритм и рассчитать нам хендл по адресу + туча паразитных действий, которые ненужны совершенно.
Ige, еще раз, чтобы отловить урон нужен триггер, с событием юнит получает урон.
К нему цепляется функия из мемхака и читает данные в памяти, записывая в глобалки, все
Вот все работает... pro100master, блин, я толкую сударю об одном, он о другом...
Нафиг забудь call TestMissileHandlerWorker( ) и ничего там не пиши, все далай в триггере, в этой функции просто идет записть значений в глобалки, все там больше нечего делать, ок?
Ige, зачем вам конвертор? Вы в кондишине триггера или экшине эти данные возьмете, нах вам лезть в DamageHandler?
Когда триггер сработал в условии триггер берешь GetTriggerUnit(), GetEventDamageSource() и так далее, тип урона берешь из глобалок. в глобалки данные пишутся перед срабатыванием условий и действий триггера.
Ige, смотрим кат Сам хак
Там сама наработка, это хук на событие внутри движка.
Собственно нам потребуется триггер, функцией InitializeDamageHandler мы лезим в структуру триггерна и ставим коверкаем его чтобы мы могли получать нужные нам данные.
Массив - дота код, рассчитан на то что юнитов получающих урон будет овер дофига как и кол-во инстансов урона, таким образом он гарантирует что при срабатывании 1 триггера, во время его потока, данные полученные с помощью функций не перезапишутся. Т.е представь что ты юзаешь GetTriggerUnit() в потоке триггера, первый раз оно вернет одного юнита, второй раз другое? Тебе оно надо, массив это вроде фикс этого эффекта.
В потоке триггера (в кондишине) ты получаешь всех кого хочешь, а значение урона берешь из глобалок, все ок?
Оффсет это офсет, не трогай чего не понимаешь - Barrage missiles always have 0x8 == 0x10000000 call BJDebugMsg("Target" + Int2Hex(RMem(pDamageTarget))) адресс цели, не путать с хендлом и прочим говном, это адресс юнита в памяти игры, нужно для работы с адресом а не с юнитом. call BJDebugMsg(Int2Hex(RMem(RMem(RMem(pDamageEspData)+0x8)+0x0)))source адресс источника урона, тоже самое. call BJDebugMsg(Int2Hex(RMem(RMem(RMem(pDamageEspData)+0x8)+0x8)))proj or link onto something// адрес куда пишут флаги всякие орбы, или что то еще..
call BJDebugMsg(Int2Hex(RMem(RMem(RMem(pDamageEspData)+0x8)+0xC)))0x101 == ranged, 0x100 == melee адресс в котором хранится значение, 0x101, что означет что урон является уроном дальнего боя (UnitDamageTarget(a,b,100, false, true, null,null,null )), 0x100 урон от ближнего боя (UnitDamageTarget(a,b,100, true, false, null,null,null )) call BJDebugMsg("Damage:" + R2S(mI2R(RMem(RMem(RMem(pDamageEspData)+0x8)+0x10))))damage val кол-во урона без учета брони, сколько было на момент успешного завершения снаряда или указанно в настройках способности которая нанесла урон.
Можно насколько я помню проигрывать звуки локально, как и его останавливать... Звук а не музыку, учтите это при импорте и создании звуковых переменных.
Будет всегда десинх, типы юнитов проверяются практически постоянно, у тебя будет несоответствие типов.
Локально создавать не локальные объекты не получится, будет десинх.
Максимум что можно, это сменить модельку с помощью мемхака.
Всякие там примеры про карты типа мафия, там юнитов создают как куклу, её не трогать ниче делать с ней низя...
Steal nerves, Не проверял, но знаю что эта бага есть - яркий пример дота фрога, аура леорика сделана для мили обычной вампирик аурой, и триггерной для ренж юнитов (им вручали руну с абилкой зелья вампиризма, иконку баффа сменили под вампирик ауру) ну дык вот, там герои с орбами получали 2 баффа сразу.
ScopteRectuS, в поиск вбиваем "Передача и хранение данных"
И ищем,подобное жевали уже не раз, помнится даже была древняя статья где все это описывалась, я привел краткое содержание.
avuremybe, ну а типо вы не знали что создание локальной переменной это действие, да и внезапно обнуление тоже действие...
Поэтому лепить 1005000 локалок, особенно в таких примитивных функциях не стоит, лучше по возможности использовать 1 темповую глобалку на много функций.
» WarCraft 3 / Атака (запуск снаряда)
» WarCraft 3 / Отслеживание порчи
» WarCraft 3 / Ловим урон с Мемхаком
Методом тыка вам тут только фаталы ловить, нужен Cheat Engine и познание структуры триггеров, покуда у вас этого нету, можно не старатся, у драколича ушело на это больше года...
Пишите личу про смену урона, только он колупал и проверял это, возможно что урон вовсе не сменить с уровня jass.
pro100master, Нужно еще понимать как там устроена структура и где прилеплен код к событию...
» WarCraft 3 / Ловим урон с Мемхаком
Чего за глупость, ты получаешь начальный урон до брони set DamageValues[DamageIncrementer]=mI2R(Memory[offset/4+0x10/4])//RMem(offset+0x10))
И GetEventDamage после, дальше в потоке триггера работай с юнитами как хочешь, зачем тебе адресса?
» WarCraft 3 / Ловим урон с Мемхаком
» WarCraft 3 / Ловим урон с Мемхаком
» WarCraft 3 / Ловим урон с Мемхаком
» WarCraft 3 / Ловим урон с Мемхаком
К нему цепляется функия из мемхака и читает данные в памяти, записывая в глобалки, все
» WarCraft 3 / Ловим урон с Мемхаком
Все там работает и GetTriggerUnit() и GetEventDamageSource()
» WarCraft 3 / Область сплэш атаки
» WarCraft 3 / Ловим урон с Мемхаком
pro100master, блин, я толкую сударю об одном, он о другом...
Нафиг забудь call TestMissileHandlerWorker( ) и ничего там не пиши, все далай в триггере, в этой функции просто идет записть значений в глобалки, все там больше нечего делать, ок?
» WarCraft 3 / Ловим урон с Мемхаком
» WarCraft 3 / Ловим урон с Мемхаком
Нахрена вам там понадобился юнит?
pro100master, Мб я что то не понимаю, что собрались делать то?
» WarCraft 3 / Ловим урон с Мемхаком
Когда триггер сработал в условии триггер берешь GetTriggerUnit(), GetEventDamageSource() и так далее, тип урона берешь из глобалок. в глобалки данные пишутся перед срабатыванием условий и действий триггера.
» WarCraft 3 / Ловим урон с Мемхаком
Там сама наработка, это хук на событие внутри движка.
Собственно нам потребуется триггер, функцией InitializeDamageHandler мы лезим в структуру триггерна и ставим коверкаем его чтобы мы могли получать нужные нам данные.
Массив - дота код, рассчитан на то что юнитов получающих урон будет овер дофига как и кол-во инстансов урона, таким образом он гарантирует что при срабатывании 1 триггера, во время его потока, данные полученные с помощью функций не перезапишутся. Т.е представь что ты юзаешь GetTriggerUnit() в потоке триггера, первый раз оно вернет одного юнита, второй раз другое? Тебе оно надо, массив это вроде фикс этого эффекта.
Оффсет это офсет, не трогай чего не понимаешь -
Barrage missiles always have 0x8 == 0x10000000
call BJDebugMsg("Target" + Int2Hex(RMem(pDamageTarget))) адресс цели, не путать с хендлом и прочим говном, это адресс юнита в памяти игры, нужно для работы с адресом а не с юнитом.
call BJDebugMsg(Int2Hex(RMem(RMem(RMem(pDamageEspData)+0x8)+0x0)))source адресс источника урона, тоже самое.
call BJDebugMsg(Int2Hex(RMem(RMem(RMem(pDamageEspData)+0x8)+0x8)))proj or link onto something// адрес куда пишут флаги всякие орбы, или что то еще..
call BJDebugMsg(Int2Hex(RMem(RMem(RMem(pDamageEspData)+0x8)+0xC)))0x101 == ranged, 0x100 == melee адресс в котором хранится значение, 0x101, что означет что урон является уроном дальнего боя (UnitDamageTarget(a,b,100, false, true, null,null,null )), 0x100 урон от ближнего боя (UnitDamageTarget(a,b,100, true, false, null,null,null ))
call BJDebugMsg("Damage:" + R2S(mI2R(RMem(RMem(RMem(pDamageEspData)+0x8)+0x10))))damage val кол-во урона без учета брони, сколько было на момент успешного завершения снаряда или указанно в настройках способности которая нанесла урон.
» WarCraft 3 / Атака (запуск снаряда)
» WarCraft 3 / Музыка с папкой
» WarCraft 3 / Создание юнита для локального игрока
Локально создавать не локальные объекты не получится, будет десинх.
Максимум что можно, это сменить модельку с помощью мемхака.
Всякие там примеры про карты типа мафия, там юнитов создают как куклу, её не трогать ниче делать с ней низя...
» WarCraft 3 / Как сделать проверку Дальний/Ближний бой?
» WarCraft 3 / Перезапись глобальных переменных
И ищем,подобное жевали уже не раз, помнится даже была древняя статья где все это описывалась, я привел краткое содержание.
» WarCraft 3 / Перезапись глобальных переменных
» WarCraft 3 / Есть ли утечка?
Поэтому лепить 1005000 локалок, особенно в таких примитивных функциях не стоит, лучше по возможности использовать 1 темповую глобалку на много функций.
» WarCraft 3 / Не сохраняет позиция
» WarCraft 3 / Как сделать проверку Дальний/Ближний бой?
» WarCraft 3 / Есть ли утечка?