Добавлен quq_CCCP,
опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Jass
Тип:
Наработка
Версия Warcraft:
1.26\1.27
Собственно обновленный детект типов урона и атаки от DracoL1ch, который позволяет отловить все параметры урона, такие как атака ближнего\дальнего боя, тип атаки, тип урона, изначальный урон без учета резистов.
Для работы этого хака нужна последняя версия мемхака, который приложен ниже.
Для работы этого хака нужна последняя версия мемхака, который приложен ниже.
сам хак
globals
integer DamageIncrementer = 0
integer array DamageAttackTypes
integer array DamageDamageTypes
real array DamageValues
//прочие переменные есть в самом мемхаке
endglobals
function TestMissileHandlerWorker takes nothing returns nothing
local integer offset=RMem(pDamageEspData)
local integer target=RMem(pDamageTarget)
if offset>0 then
set offset=Memory[offset/4+2]//RMem(offset+0x8)
endif
if DamageIncrementer>8000 then
set DamageIncrementer=10
endif
set DamageIncrementer=DamageIncrementer+1
//call BJDebugMsg("dmg event "+I2S(DamageIncrementer)+" source="+Id2String(RMem(target+0x30))+" val="+R2S(mI2R(Memory[offset/4+0x10/4])))
if offset>0 then
set DamageAttackTypes[DamageIncrementer]=Memory[offset/4+0x20/4]//RMem(offset+0x20)
set DamageDamageTypes[DamageIncrementer]=Memory[offset/4+0x14/4]//RMem(offset+0x14)
set DamageValues[DamageIncrementer]=mI2R(Memory[offset/4+0x10/4])//RMem(offset+0x10))
//call ExecuteFunc("PreDamageWorker")
endif
endfunction
function TestMissileHandler takes nothing returns nothing
call TestMissileHandlerWorker( )
// local integer offset=RMem(RMem(pDamageEspData)+0x8)
// if DamageIncrementer>8000 then
// set DamageIncrementer=10
// endif
// set DamageIncrementer=DamageIncrementer+1
// set DamageValues[DamageIncrementer]=mI2R(RMem(offset+0x10))
// set DamageAttackTypes[DamageIncrementer]=RMem(offset+0x20)
// set DamageDamageTypes[DamageIncrementer]=RMem(offset+0x14)
// call TestIfdamageHookCrash()
// return
// call ExecuteFunc("PreDamageWorker")
//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
// call BJDebugMsg("Damage:" + R2S(mI2R(RMem(RMem(RMem(pDamageEspData)+0x8)+0x10))))//damage val
endfunction
function InitializeDamageHandler takes integer pTriggerHandle returns nothing
local integer pUnitDamageHandler = pUnitVtable+0x120
local integer oldprotection = ChangeOffsetProtection(pUnitDamageHandler,4,0x40)
set Memory[pReservedMemoryForDamageHandler/4+0]=0xB890C08B
set Memory[pReservedMemoryForDamageHandler/4+1]=pDamageTarget
set Memory[pReservedMemoryForDamageHandler/4+2]=0xB8900889
set Memory[pReservedMemoryForDamageHandler/4+3]=pDamageEspData
set Memory[pReservedMemoryForDamageHandler/4+4]=0x68602089
set Memory[pReservedMemoryForDamageHandler/4+5]=pTriggerHandle
set Memory[pReservedMemoryForDamageHandler/4+6]=0xB890C08B
set Memory[pReservedMemoryForDamageHandler/4+7]=pTriggerExecute
set Memory[pReservedMemoryForDamageHandler/4+8]=0xC483D0FF
set Memory[pReservedMemoryForDamageHandler/4+9]=0xB8906104
set Memory[pReservedMemoryForDamageHandler/4+10]=pRealUnitDamageHandler
set Memory[pReservedMemoryForDamageHandler/4+11]=0xCCCCE0FF
//call BJDebugMsg(Int2Hex(pReservedMemoryForDamageHandler))
call WMem(pUnitDamageHandler,pReservedMemoryForDamageHandler)
set oldprotection = ChangeOffsetProtection(pUnitDamageHandler,4,oldprotection)
endfunction
Инициализация хака
set t=CreateTrigger()
call TriggerAddAction(t,function TestMissileHandler)
call InitializeDamageHandler(GetHandleId(t))
//далее уже делаем что хотим в функции TestMissileHandler )
А вот еще одна полезная функция:
Проверка типа урона
Кто уже скачал систему заметил, что тип атаки это числа от 0 до 6, каждый тип имеет свое число, задается через ConvertDamageType(N)
Но как же быть с типом урона, система выводит на экран какие то числа от 0 до нескольких тысяч, которые не похожи на damagetype, как же их превратить в тип урона, если ConvertDamageType() возвращает null с этих чисел? А вот как, код приведенный ниже поможет вам сопоставить константы типов урона и выведенные системой данные:
Но как же быть с типом урона, система выводит на экран какие то числа от 0 до нескольких тысяч, которые не похожи на damagetype, как же их превратить в тип урона, если ConvertDamageType() возвращает null с этих чисел? А вот как, код приведенный ниже поможет вам сопоставить константы типов урона и выведенные системой данные:
function DT2DT takes integer k returns integer
local integer i = 1
if k == 0 then
return 0
endif
loop
exitwhen k / 2 <= 1
set i = i + 1
set k = k / 2
endloop
return i
endfunction
//пример использования:
ConvertDamageType(DT2DT(dmgTypeHex))==DAMAGE_TYPE_FIRE
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Чего за глупость, ты получаешь начальный урон до брони set DamageValues[DamageIncrementer]=mI2R(Memory[offset/4+0x10/4])//RMem(offset+0x10))
И GetEventDamage после, дальше в потоке триггера работай с юнитами как хочешь, зачем тебе адресса?
Методом тыка вам тут только фаталы ловить, нужен Cheat Engine и познание структуры триггеров, покуда у вас этого нету, можно не старатся, у драколича ушело на это больше года...
Пишите личу про смену урона, только он колупал и проверял это, возможно что урон вовсе не сменить с уровня jass.
pro100master, Нужно еще понимать как там устроена структура и где прилеплен код к событию...
Фигня или не фигня (хотя я склоняюсь как раз к первому варианту), только она пока что работает и без сбоев