Почему вылетает фатал при попытке выдать одной абилке перезарядку при применении другой? Я совершенно ничего не понимаю.
код карты
// reserved native for call 4 integer function and return BOOLEAN value
native MergeUnits		   takes integer qty, integer a, integer b, integer make returns boolean
// reserved native for call 2 integer function and return BOOLEAN value (can be converted to int!)
native ConvertUnits         takes integer qty, integer id               returns boolean
// reserved native for call 1 integer function and return integer value
native IgnoredUnits takes integer unitid returns integer

function CallFastCallWith1Args takes integer pFuncFastcallAddr, integer arg1 returns integer
    local integer pOffset1

    call WriteRealMemory(pReservedExecutableMemory2, 0xB9F68B56)
    call WriteRealMemory(pReservedExecutableMemory2+4, arg1)
    call WriteRealMemory(pReservedExecutableMemory2+8, 0xBEF68B90)
    call WriteRealMemory(pReservedExecutableMemory2+12, pFuncFastcallAddr)
    call WriteRealMemory(pReservedExecutableMemory2+16, 0xC35ED6FF)
 
 
    if pIgnoredUnitsOffset == 0 then
        set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 )
    else
        call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2)
    endif
 

    set pOffset1 = IgnoredUnits(0)
    call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits)
    return pOffset1
endfunction


function CallFastCallWith2Args takes integer pFuncFastcallAddr, integer arg1, integer arg2 returns integer
    local integer pOffset1

    call WriteRealMemory(pReservedExecutableMemory2, 0xBAF68B56)
    call WriteRealMemory(pReservedExecutableMemory2+4, arg2)
    call WriteRealMemory(pReservedExecutableMemory2+8, 0xB9F68B90)
    call WriteRealMemory(pReservedExecutableMemory2+12, arg1)
    call WriteRealMemory(pReservedExecutableMemory2+16, 0xBEF68B90)
    call WriteRealMemory(pReservedExecutableMemory2+20, pFuncFastcallAddr)
    call WriteRealMemory(pReservedExecutableMemory2+24, 0xC35ED6FF)
 
 
    if pIgnoredUnitsOffset == 0 then
        set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 )
    else
        call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2)
    endif
 

    set pOffset1 = IgnoredUnits(0)
    call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits)
    return pOffset1
endfunction


function CallFastCallWith3Args takes integer pFuncFastcallAddr, integer arg1, integer arg2, integer arg3 returns integer
    local integer pOffset1

    call WriteRealMemory(pReservedExecutableMemory2, 0x68F68B56)
    call WriteRealMemory(pReservedExecutableMemory2+4, arg3)
    call WriteRealMemory(pReservedExecutableMemory2+8, 0xBAF68B90)
    call WriteRealMemory(pReservedExecutableMemory2+12, arg2)
    call WriteRealMemory(pReservedExecutableMemory2+16, 0xB9F68B90)
    call WriteRealMemory(pReservedExecutableMemory2+20, arg1)
    call WriteRealMemory(pReservedExecutableMemory2+24, 0xBEF68B90)
    call WriteRealMemory(pReservedExecutableMemory2+28, pFuncFastcallAddr)
    call WriteRealMemory(pReservedExecutableMemory2+32, 0xC35ED6FF)
 
 
    if pIgnoredUnitsOffset == 0 then
        set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 )
    else
        call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2)
    endif
 

    set pOffset1 = IgnoredUnits(0)
    call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits)
    return pOffset1
endfunction


function FUCKINGCallWith4Args takes integer pFuncFastcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4 returns integer
    local integer pOffset1

    call WriteRealMemory(pReservedExecutableMemory2, 0x68F68B56)
    call WriteRealMemory(pReservedExecutableMemory2+4, arg4)
    call WriteRealMemory(pReservedExecutableMemory2+8, 0x68F68B90)
    call WriteRealMemory(pReservedExecutableMemory2+12, arg3)
    call WriteRealMemory(pReservedExecutableMemory2+16, 0xB8F68B90)
    call WriteRealMemory(pReservedExecutableMemory2+20, arg2)
    call WriteRealMemory(pReservedExecutableMemory2+24, 0xBFF68B90)
    call WriteRealMemory(pReservedExecutableMemory2+28, arg1)
    call WriteRealMemory(pReservedExecutableMemory2+32, 0xBEF68B90)
    call WriteRealMemory(pReservedExecutableMemory2+36, pFuncFastcallAddr)
    call WriteRealMemory(pReservedExecutableMemory2+40, 0xC35ED6FF)

    if pIgnoredUnitsOffset == 0 then
        set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 )
    else
        call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2)
    endif
 

    set pOffset1 = IgnoredUnits(0)
    call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits)
    return pOffset1
endfunction

function CallFastCallWith4Args takes integer pFuncFastcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4 returns integer
    local integer pOffset1

    call WriteRealMemory(pReservedExecutableMemory2, 0x68F68B56)
    call WriteRealMemory(pReservedExecutableMemory2+4, arg4)
    call WriteRealMemory(pReservedExecutableMemory2+8, 0x68F68B90)
    call WriteRealMemory(pReservedExecutableMemory2+12, arg3)
    call WriteRealMemory(pReservedExecutableMemory2+16, 0xBAF68B90)
    call WriteRealMemory(pReservedExecutableMemory2+20, arg2)
    call WriteRealMemory(pReservedExecutableMemory2+24, 0xB9F68B90)
    call WriteRealMemory(pReservedExecutableMemory2+28, arg1)
    call WriteRealMemory(pReservedExecutableMemory2+32, 0xBEF68B90)
    call WriteRealMemory(pReservedExecutableMemory2+36, pFuncFastcallAddr)
    call WriteRealMemory(pReservedExecutableMemory2+40, 0xC35ED6FF)
 
 
    if pIgnoredUnitsOffset == 0 then
        set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 )
    else
        call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2)
    endif
 

    set pOffset1 = IgnoredUnits(0)
    call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits)
    return pOffset1
endfunction


function CallFastCallWith5Args takes integer pFuncFastcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4, integer arg5 returns integer
    local integer pOffset1

    call WriteRealMemory(pReservedExecutableMemory2, 0x68F68B56)
    call WriteRealMemory(pReservedExecutableMemory2+4, arg5)
    call WriteRealMemory(pReservedExecutableMemory2+8, 0x68F68B90)
    call WriteRealMemory(pReservedExecutableMemory2+12, arg4)
    call WriteRealMemory(pReservedExecutableMemory2+16, 0x68F68B90)
    call WriteRealMemory(pReservedExecutableMemory2+20, arg3)
    call WriteRealMemory(pReservedExecutableMemory2+24, 0xBAF68B90)
    call WriteRealMemory(pReservedExecutableMemory2+28, arg2)
    call WriteRealMemory(pReservedExecutableMemory2+32, 0xB9F68B90)
    call WriteRealMemory(pReservedExecutableMemory2+36, arg1)
    call WriteRealMemory(pReservedExecutableMemory2+40, 0xBEF68B90)
    call WriteRealMemory(pReservedExecutableMemory2+44, pFuncFastcallAddr)
    call WriteRealMemory(pReservedExecutableMemory2+48, 0xC35ED6FF)
 
 
    if pIgnoredUnitsOffset == 0 then
        set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 )
    else
        call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2)
    endif
 

    set pOffset1 = IgnoredUnits(0)
    call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits)
    return pOffset1
endfunction




function CallFastCallWith6Args takes integer pFuncFastcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4, integer arg5, integer arg6 returns integer
    local integer pOffset1

    call WriteRealMemory(pReservedExecutableMemory2, 0x68F68B56)
    call WriteRealMemory(pReservedExecutableMemory2+4, arg6)
    call WriteRealMemory(pReservedExecutableMemory2+8, 0x68F68B90)
    call WriteRealMemory(pReservedExecutableMemory2+12, arg5)
    call WriteRealMemory(pReservedExecutableMemory2+16, 0x68F68B90)
    call WriteRealMemory(pReservedExecutableMemory2+20, arg4)
    call WriteRealMemory(pReservedExecutableMemory2+24, 0x68F68B90)
    call WriteRealMemory(pReservedExecutableMemory2+28, arg3)
    call WriteRealMemory(pReservedExecutableMemory2+32, 0xBAF68B90)
    call WriteRealMemory(pReservedExecutableMemory2+36, arg2)
    call WriteRealMemory(pReservedExecutableMemory2+40, 0xB9F68B90)
    call WriteRealMemory(pReservedExecutableMemory2+44, arg1)
    call WriteRealMemory(pReservedExecutableMemory2+48, 0xBEF68B90)
    call WriteRealMemory(pReservedExecutableMemory2+52, pFuncFastcallAddr)
    call WriteRealMemory(pReservedExecutableMemory2+56, 0xC35ED6FF)
 
 
    if pIgnoredUnitsOffset == 0 then
        set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 )
    else
        call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2)
    endif
 

    set pOffset1 = IgnoredUnits(0)
    call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits)
    return pOffset1
endfunction



function CallFastCallWith7Args takes integer pFuncFastcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4, integer arg5, integer arg6, integer arg7 returns integer
    local integer pOffset1

    call WriteRealMemory(pReservedExecutableMemory2, 0x68F68B56)
    call WriteRealMemory(pReservedExecutableMemory2+4, arg7)
    call WriteRealMemory(pReservedExecutableMemory2+8, 0x68F68B90)
    call WriteRealMemory(pReservedExecutableMemory2+12, arg6)
    call WriteRealMemory(pReservedExecutableMemory2+16, 0x68F68B90)
    call WriteRealMemory(pReservedExecutableMemory2+20, arg5)
    call WriteRealMemory(pReservedExecutableMemory2+24, 0x68F68B90)
    call WriteRealMemory(pReservedExecutableMemory2+28, arg4)
    call WriteRealMemory(pReservedExecutableMemory2+32, 0x68F68B90)
    call WriteRealMemory(pReservedExecutableMemory2+36, arg3)
    call WriteRealMemory(pReservedExecutableMemory2+40, 0xBAF68B90)
    call WriteRealMemory(pReservedExecutableMemory2+44, arg2)
    call WriteRealMemory(pReservedExecutableMemory2+48, 0xB9F68B90)
    call WriteRealMemory(pReservedExecutableMemory2+52, arg1)
    call WriteRealMemory(pReservedExecutableMemory2+56, 0xBEF68B90)
    call WriteRealMemory(pReservedExecutableMemory2+60, pFuncFastcallAddr)
    call WriteRealMemory(pReservedExecutableMemory2+64, 0xC35ED6FF)
 
 
    if pIgnoredUnitsOffset == 0 then
        set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 )
    else
        call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2)
    endif
 

    set pOffset1 = IgnoredUnits(0)
    call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits)
    return pOffset1
endfunction


function CallFastCallWith8Args takes integer pFuncFastcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4, integer arg5, integer arg6, integer arg7, integer arg8 returns integer
    local integer pOffset1

    call WriteRealMemory(pReservedExecutableMemory2, 0x68F68B56)
    call WriteRealMemory(pReservedExecutableMemory2+4, arg8)
    call WriteRealMemory(pReservedExecutableMemory2+8, 0x68F68B90)
    call WriteRealMemory(pReservedExecutableMemory2+12, arg7)
    call WriteRealMemory(pReservedExecutableMemory2+16, 0x68F68B90)
    call WriteRealMemory(pReservedExecutableMemory2+20, arg6)
    call WriteRealMemory(pReservedExecutableMemory2+24, 0x68F68B90)
    call WriteRealMemory(pReservedExecutableMemory2+28, arg5)
    call WriteRealMemory(pReservedExecutableMemory2+32, 0x68F68B90)
    call WriteRealMemory(pReservedExecutableMemory2+36, arg4)
    call WriteRealMemory(pReservedExecutableMemory2+40, 0x68F68B90)
    call WriteRealMemory(pReservedExecutableMemory2+44, arg3)
    call WriteRealMemory(pReservedExecutableMemory2+48, 0xBAF68B90)
    call WriteRealMemory(pReservedExecutableMemory2+52, arg2)
    call WriteRealMemory(pReservedExecutableMemory2+56, 0xB9F68B90)
    call WriteRealMemory(pReservedExecutableMemory2+60, arg1)
    call WriteRealMemory(pReservedExecutableMemory2+64, 0xBEF68B90)
    call WriteRealMemory(pReservedExecutableMemory2+68, pFuncFastcallAddr)
    call WriteRealMemory(pReservedExecutableMemory2+72, 0xC35ED6FF)
 
 
    if pIgnoredUnitsOffset == 0 then
        set pIgnoredUnitsOffset = CreateJassNativeHook(pIgnoredUnits, pReservedExecutableMemory2 )
    else
        call WriteRealMemory(pIgnoredUnitsOffset,pReservedExecutableMemory2)
    endif
 

    set pOffset1 = IgnoredUnits(0)
    call WriteRealMemory(pIgnoredUnitsOffset, pIgnoredUnits)
    return pOffset1
endfunction

function CallThisCallWith1Args takes integer pFuncThiscallAddr, integer arg1 returns integer
    return CallFastCallWith2Args(pFuncThiscallAddr,arg1,0)
endfunction

function CallThisCallWith2Args takes integer pFuncThiscallAddr, integer arg1, integer arg2 returns integer
    return CallFastCallWith3Args(pFuncThiscallAddr,arg1,0,arg2)
endfunction

function CallThisCallWith3Args takes integer pFuncThiscallAddr, integer arg1, integer arg2, integer arg3 returns integer
    return CallFastCallWith4Args(pFuncThiscallAddr,arg1,0,arg2,arg3)
endfunction

function CallThisCallWith4Args takes integer pFuncThiscallAddr, integer arg1, integer arg2, integer arg3, integer arg4 returns integer
    return CallFastCallWith5Args(pFuncThiscallAddr,arg1,0,arg2,arg3,arg4)
endfunction

function CallThisCallWith5Args takes integer pFuncThiscallAddr, integer arg1, integer arg2, integer arg3, integer arg4, integer arg5 returns integer
    return CallFastCallWith6Args(pFuncThiscallAddr,arg1,0,arg2,arg3,arg4,arg5)
endfunction

function CallThisCallWith6Args takes integer pFuncThiscallAddr, integer arg1, integer arg2, integer arg3, integer arg4, integer arg5, integer arg6 returns integer
    return CallFastCallWith7Args(pFuncThiscallAddr,arg1,0,arg2,arg3,arg4,arg5,arg6)
endfunction

function CallThisCallWith7Args takes integer pFuncThiscallAddr, integer arg1, integer arg2, integer arg3, integer arg4, integer arg5, integer arg6, integer arg7 returns integer
    return CallFastCallWith8Args(pFuncThiscallAddr,arg1,0,arg2,arg3,arg4,arg5,arg6,arg7)
endfunction

function StartAbilityCD takes integer pAbility, real cd returns nothing
    set Memory[pReserverdIntArg1/4] = cleanInt(realToIndex(cd))
    call CallThisCallWith2Args(pStartAbilityCD,pAbility, pReserverdIntArg1)
endfunction
код абилки
function Trig_Eviscerate_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A00J' ) ) then
        return false
    endif
    return true
endfunction

function Trig_Eviscerate_Actions takes nothing returns nothing
    call UnitDamageTargetBJ( GetSpellAbilityUnit(), GetSpellTargetUnit(), ( I2R(udg_ComboPoints) * ( 3.00 + ( 2.00 * I2R(GetUnitAbilityLevelSwapped('A00J', GetSpellAbilityUnit())) ) ) ), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL )
    set udg_ComboPoints = ( udg_ComboPoints + ( GetUnitAbilityLevelSwapped('A00I', GetSpellAbilityUnit()) * 10 ) )
    call StartAbilityCD('A00I',10)
endfunction

//===========================================================================
function InitTrig_Eviscerate takes nothing returns nothing
    set gg_trg_Eviscerate = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Eviscerate, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Eviscerate, Condition( function Trig_Eviscerate_Conditions ) )
    call TriggerAddAction( gg_trg_Eviscerate, function Trig_Eviscerate_Actions )
endfunction

Принятый ответ

Похожие вопросы:

ответ
Возможно "канал" так же имеет отличную от остальных абилок структуру
Рабочий вариант
function StartAbilityCD takes unit whichUnit, integer abilityId returns boolean
local integer pAbility = 0
local real cd = GetAbilityCD(abilityId, GetPlayerId(GetOwningPlayer(whichUnit))+1)
if whichUnit == null or GetUnitAbilityLevel( whichUnit, abilityId ) < 1 or cd == 0.00 then
return false
endif

set pAbility = GetUnitAbility(whichUnit, abilityId)
if pAbility < 1 then
return false
else
if RMem(pAbility+0x134)==-1 and RMem(pAbility+0x138)==-1 then
call WMem(pAbility+0x134,0)
call WMem(pAbility+0x138,0)
endif
set Memory[pReserverdIntArg1 / 4] = mR2I(cd)
call CallThisCallWith2Args( pStartAbilityCD, pAbility, pReserverdIntArg1 )
return IsAbilityOnCooldown( pAbility )
endif
return false
endfunction

`
ОЖИДАНИЕ РЕКЛАМЫ...
4
19
5 лет назад
4
Похожие вопросы:

ответ
Возможно "канал" так же имеет отличную от остальных абилок структуру
Рабочий вариант
function StartAbilityCD takes unit whichUnit, integer abilityId returns boolean
local integer pAbility = 0
local real cd = GetAbilityCD(abilityId, GetPlayerId(GetOwningPlayer(whichUnit))+1)
if whichUnit == null or GetUnitAbilityLevel( whichUnit, abilityId ) < 1 or cd == 0.00 then
return false
endif

set pAbility = GetUnitAbility(whichUnit, abilityId)
if pAbility < 1 then
return false
else
if RMem(pAbility+0x134)==-1 and RMem(pAbility+0x138)==-1 then
call WMem(pAbility+0x134,0)
call WMem(pAbility+0x138,0)
endif
set Memory[pReserverdIntArg1 / 4] = mR2I(cd)
call CallThisCallWith2Args( pStartAbilityCD, pAbility, pReserverdIntArg1 )
return IsAbilityOnCooldown( pAbility )
endif
return false
endfunction

Принятый ответ
0
16
5 лет назад
0
Мне нравится этот парень сверху!

О-о-о, всё, я ушёл читать тему мемхака.

Едрить, по-моему, я понял. Господи, ну да, это логично, что у меня фаталило, я ж не давал никакую ссылку на то, у какого юнита перезаряжать.

Стоп, не, не понял, как тогда другую абилку перезаряжать. Так...

Разобрался. Шикарно.
2
32
5 лет назад
2
Naadir, если разберёшься, смотри как в сларках сделано, там я в прикол задействовал почти каждую функцию мемхака по разу, тока там второй мемхак
0
16
5 лет назад
Отредактирован Naadir
0
Bergi_Bear, окей, спасибо.
2
32
5 лет назад
2
Naadir, там все просто, Bergi_Bear, или в теме с детектом урона второй мемхак, там вылечены фаталы и прочие проблемы, о которых было известно. В теме с мемхаком задавай вопрос о том как пользоваться функциями, постараюсь помочь.
0
16
5 лет назад
0
quq_CCCP, принято.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.