Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
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 с этих чисел? А вот как, код приведенный ниже поможет вам сопоставить константы типов урона и выведенные системой данные:
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
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
23
7 лет назад
0
function TestMissileHandler takes nothing returns nothing
    call TestMissileHandlerWorker( )


	тут берем адреса таргета и источика и работаем
endfunction
0
32
7 лет назад
0
Вот все работает...
pro100master, блин, я толкую сударю об одном, он о другом...
Нафиг забудь call TestMissileHandlerWorker( ) и ничего там не пиши, все далай в триггере, в этой функции просто идет записть значений в глобалки, все там больше нечего делать, ок?
Загруженные файлы
0
7
7 лет назад
0
Вроде бы откопал в доте, то что нужно. Проверю и отпишусь
    integer Int2Unit
    integer l__Int2Unit

    function setInt2Unit takes integer i returns nothing
        set l__Int2Unit = i
        return //Prevents JassHelper from inlining this function
    endfunction

    function Typecast4 takes nothing returns nothing
        local unit Int2Unit
    endfunction

    integer pGetUnitForAddress = 0
    function GetUnitForAddress takes integer addr returns integer // не знал какое имя дать -> дал первое, что пришло в голову)
        if pGetUnitForAddress == 0 then
            pGetUnitForAddress = GameDLL + 0x2DCC40
        endif

        return CallFastCallWith2Args(pGetUnitForAddress, addr, 0)
    endfunction

    function Int2Unit takes integer i returns unit
        call setInt2Unit(GetUnitForAddress(i))
        return l__Int2Unit
    endfunction
0
32
7 лет назад
0
Ige, Это не то что нужно, я тебе скинул код.
Все там работает и GetTriggerUnit() и GetEventDamageSource()
0
23
7 лет назад
0
Инициализация ему надо еше и толковать мб???
0
7
7 лет назад
0
quq_CCCP, я, наверно, неправильно выразился. То что ты мне скинул - это совсем не то, что я имел ввиду. Минуту, я итоговый скрин сделаю.
0
32
7 лет назад
0
Ige, еще раз, чтобы отловить урон нужен триггер, с событием юнит получает урон.
К нему цепляется функия из мемхака и читает данные в памяти, записывая в глобалки, все
0
7
7 лет назад
0
Сработало!)
Загруженные файлы
0
32
7 лет назад
0
Ты дальше работаешь с юнитами в триггере, ненадо никаких конвертов юнитов, не говоря о том что это медленно, CallFastCallWith2Args(pGetUnitForAddress, addr, 0) заставляет игру выполнить внутринний алгоритм и рассчитать нам хендл по адресу + туча паразитных действий, которые ненужны совершенно.
0
23
7 лет назад
0
Ige, ну вот
0
32
7 лет назад
0
Ige, код мб юзер нам покажет, а ?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.