где можно взять данную библиотку, не захламленную функциями для доты? хотел удалить все, но там,оказывается есть нужные функции, которые используются в нужных мне функциях.

Utils
library Utils uses Typecast, Memory, Bitwise, StringId, ObjectData


    function ConvertHandle takes handle h returns integer
        if GetHandleId( h ) > 0 then
            return RMem( RMem( RMem( RMem( GameState ) + 28 ) + 412 ) + GetHandleId( h ) * 12 - 0x2FFFFF * 4 )
        endif
        return 0
    endfunction

    function ConvertPointer takes integer ptr returns integer
        local integer i = RMem( ptr )
        if i < 0 then
            return RMem( RMem( pointers + 44 ) - i * 8 + 4 ) //checkme
        endif
        return RMem( RMem( pointers + 12 ) + i * 8 + 4 )
    endfunction

    function IsFlagBitSet takes integer flags, integer bit returns boolean
        if bit != 0 then
            return flags / bit * 0x80000000 != 0
        endif
        return false
    endfunction
    
    function GetUnitFlags0x5C takes unit u returns integer
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            return RMem( LastConvertedHandle + 0x5C )
        endif
        return 0
    endfunction

    function SetUnitFlags0x5C takes unit u, integer i returns nothing
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            call WMem( LastConvertedHandle + 0x5C, i )
        endif
    endfunction

    function AddUnitFlags0x5C takes unit u, integer i returns nothing
        local integer f
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            set f = RMem( LastConvertedHandle + 0x5C )
            if i > 0 then
                if not IsFlagBitSet( f, i ) then
                    call WMem( LastConvertedHandle + 0x5C, f + i )
                endif
            else
                if IsFlagBitSet( f, -i ) then
                    call WMem( LastConvertedHandle + 0x5C, f + i )
                endif
            endif
        endif
    endfunction

//armor types:
// 0 - Light; 1 - Medium; 2 - Heavy; 3 - Fortified; 4 - Normal; 5 - Hero; 6 - Divine; 7 - unarmored; 
//rest seems to have Light properties
    function GetUnitArmorType takes unit u returns integer
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            return RMem( LastConvertedHandle + 0xE4 )
        endif
        return 0
    endfunction

    function SetUnitArmorType takes unit u, integer id returns nothing
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            call WMem( LastConvertedHandle + 0xE4, id )
        endif
    endfunction

    function GetUnitArmor takes unit u returns real
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            return mI2R( RMem( LastConvertedHandle + 0xE0 ) )
        endif
        return 0.
    endfunction

    function SetUnitArmor takes unit u, real r returns nothing
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            call WMem( LastConvertedHandle + 0xE0, mR2I( r ) )
        endif
    endfunction

    function SetUnitTypeId takes unit u, integer i returns nothing
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            call WMem( LastConvertedHandle + 0x30, i )
        endif
    endfunction

    function GetUnitTypeIdReal takes integer i returns integer
        return RMem( i + 0x30 )
    endfunction

    function GetUnitTypeId2 takes unit u returns integer
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            return GetUnitTypeIdReal( LastConvertedHandle )
        endif
        return 0
    endfunction

    function SetUnitPhased takes unit u returns nothing
        local integer data = GetObjectDataCaching( pUnitData , GetUnitTypeId( u ) ) + 0x1AC
        local integer p1 = RMem( data )
        local integer p2 = RMem( data + 4 )
//	call BJDebugMsg(Int2Hex((data-107)*4))
        call WMem( data, 8 )
        call WMem( data + 4, 16 )
        call SetUnitPathing( u, true )
        call WMem( data, p1 )
        call WMem( data + 4, p2 )
    endfunction

    function GetUnitFlags0x20 takes unit u returns integer
        local integer a = ConvertHandle( u )
        if a > 0 then
            return RMem( a + 0x20 )
        endif
        return 0
    endfunction

    function SetUnitFlags0x20 takes unit u, integer i returns nothing
        local integer a = ConvertHandle( u )
        if a > 0 then
            call WMem( a + 0x20, i )
        endif
    endfunction

    function AddUnitFlags0x20 takes unit u, integer flag returns nothing
        local integer a = ConvertHandle( u )
        local integer f
        if a > 0 then
            set f = RMem( a + 0x20 )
            if IsFlagBitSet( f, flag ) then
                return
            endif
            call WMem( a + 0x20, f + flag )
        endif
    endfunction

    function ModifyUnitFlags0x20 takes unit u, integer flag returns nothing
        local integer a = ConvertHandle( u )
        local integer f
        if a > 0 then
            set f = RMem( a + 0x20 )
            if flag > 0 then
                if IsFlagBitSet( f, flag ) then
                    return
                endif
                call WMem( a + 0x20, f + flag )
            else
                if IsFlagBitSet( f, -flag ) then
                    call WMem( a + 0x20, f + flag )
                endif
            endif
        endif
    endfunction

// Real - addres in memory

    function GetRealPlayerById takes integer i returns integer
        local integer pladdr = RMem( pGlobalPlayerClass )
        if pladdr > 0 then
            return RMem( pladdr + ( i * 4 ) + 0x58 )
        endif
        return 0
    endfunction

    function GetLocalPlayerIdReal takes nothing returns integer
        local integer pladdr = RMem( pGlobalPlayerClass )
        if pladdr > 0 then
            return RMem( pladdr + 0xA )
        endif
        return - 1
    endfunction

    function GetLocalPlayerReal takes nothing returns integer
        return GetRealPlayerById( GetLocalPlayerIdReal( ) )
    endfunction

// Get Selected Unit
    function GetPlayerSelectedUnitReal takes integer realplayer returns integer
        local integer pladdr = realplayer + 0x34
        set pladdr = RMem( pladdr )
        if pladdr > 0 then
            return RMem( pladdr + 0x1E0 )
        endif
        return - 1
    endfunction
    
    function SetPlayerSelectedUnitReal takes integer realplayer, integer pConvertedHandle returns nothing
        local integer pladdr = realplayer + 0x34
        set pladdr = RMem( pladdr )
        if pladdr > 0 then
            call WMem( pladdr + 0x1E0, pConvertedHandle )
        endif
    endfunction
    
    function GetJassContext takes integer id returns integer
        return ReadUnrealMemory( ReadUnrealMemory( ReadUnrealMemory( RMem( pJassEnvAddress ) / 4 + 5 ) / 4 + 36 ) / 4 + id )
    endfunction

    function GetStringAddress takes string s returns integer
        if s == EXTRADLLNAME then
            if ExtraDLLStringAddress == 0 then
                set ExtraDLLStringAddress = ReadUnrealMemory( ReadUnrealMemory( ReadUnrealMemory( ReadUnrealMemory( GetJassContext( 1 ) / 4 + 2589 ) / 4 + 2 ) / 4 + SH2I( EXTRADLLNAME ) * 4 + 2 ) / 4 + 7 )
            endif
            return ExtraDLLStringAddress
        endif
        return ReadUnrealMemory( ReadUnrealMemory( ReadUnrealMemory( ReadUnrealMemory( GetJassContext( 1 ) / 4 + 2589 ) / 4 + 2 ) / 4 + SH2I( s ) * 4 + 2 ) / 4 + 7 )
    endfunction

    function WriteNullTerminatedString takes string s, integer a returns nothing
        call WMem( a, GetStringAddress( s ) )
    endfunction

    function GetDefAddr takes integer id, integer class, integer first, integer currentOffset returns integer
        local integer FirstDataDefEntry
        local integer CurrentDefAddr = 0
        local integer FirstDefAddr
        local integer CurrentDefId = 0
        if first < 1 then
            //set tt_str1 = "Not found DefAddr 0 id=" + I2S( id ) + " class=" + I2S( class )
            call ExecuteFunc( "JassLogWrapper" )
            return 0
        endif
        set FirstDataDefEntry = RMem( first )
        if FirstDataDefEntry > 0 then
            set CurrentDefAddr = RMem( FirstDataDefEntry + 8 )
        endif
        set CurrentDefAddr = CurrentDefAddr + currentOffset
        set FirstDefAddr = CurrentDefAddr
        if FirstDataDefEntry < currentOffset then
            //set tt_str1 = "Not found DefAddr 1 id=" + I2S( id ) + " class=" + I2S( class )
            call ExecuteFunc( "JassLogWrapper" )
            return 0
        endif
        loop
            set CurrentDefId = RMem( CurrentDefAddr + 8 )
//		call echo("CurDefVal: "+Int2Hex(CurrentDefId) +" "+ Int2Hex(CurrentDefAddr))
            if HaveSavedInteger( ObjectDataPointersTable, class, CurrentDefId ) == false and CurrentDefAddr > 0xC then
                call SaveInteger( ObjectDataPointersTable, class, CurrentDefId, CurrentDefAddr - 0xC )
            endif
            exitwhen CurrentDefId == id or CurrentDefAddr < 1
            set CurrentDefAddr = RMem( CurrentDefAddr )
            if CurrentDefAddr < 1 or CurrentDefAddr == FirstDefAddr then
                //set tt_str1 = "Not found DefAddr 2 id=" + I2S( id ) + " class=" + I2S( class )
                call ExecuteFunc( "JassLogWrapper" )
                return 0
            endif
        endloop
        if CurrentDefAddr < 0xD then
            //set tt_str1 = "Not found DefAddr 3 id=" + I2S( id ) + " class=" + I2S( class ) + " curDef=" + I2S( CurrentDefAddr )
            call ExecuteFunc( "JassLogWrapper" )
            return 0
        endif
        set CurrentDefAddr = CurrentDefAddr - 0xC
        if CurrentDefAddr == Actual0xAB5948ForVersion then
            return 0
        endif
        return CurrentDefAddr// as GetObjectData * 4 but search only by id..
    endfunction

    function GetDefAddrCaching takes integer id, integer class, integer first, integer currentOffset returns integer
        if HaveSavedInteger( ObjectDataPointersTable, class, id ) then
//		call echo("loaded")
            return LoadInteger( ObjectDataPointersTable, class, id )
        endif
        return GetDefAddr( id, class, first, currentOffset )
    endfunction

    

//1 = str, 2 = int, 3 = agi
    function GetHeroPrimaryAttribute takes unit u returns integer
        local integer a = ConvertHandle( u )
        if a > 0 then
            set a = RMem( a + 0x1F0 )
            if a > 0 then
                return RMem( a + 0xCC )
            endif
        endif
        return 0
    endfunction

    function SetHeroPrimaryAttribute takes unit u, integer i returns nothing
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            if IsHeroUnitId( GetUnitTypeId( u ) ) then
                set LastConvertedHandle = RMem( LastConvertedHandle + 0x1F0 )
                if LastConvertedHandle > 0 then
                    call WMem( LastConvertedHandle + 0xCC, i )
                endif
            endif
        endif
    endfunction

    function SetAbilityManaCost takes integer abil, integer level, integer cost returns nothing
        local integer a = GetObjectDataCaching( pAbilityData, abil )
        if a > 0 then
            set a = RMem( a + 0x54 )
            if a > 0 then
                call WMem( a - 0x58 + level * 0x68, cost )
            endif
        endif
    endfunction

    function GetAbilityManaCost takes integer abil, integer level returns integer
        local integer a = GetObjectDataCaching( pAbilityData, abil )
        if a > 0 then
            set a = RMem( a + 0x54 )
            if a > 0 then
                return RMem( a - 0x58 + level * 0x68 )
            endif
        endif
        return 0
    endfunction

    function GetAbilityManaCostAddr takes integer add, integer level returns integer
        local integer a = RMem( add + 0x54 )
        if a > 0 then
            return RMem( a + level * 0x68 )
        endif
        return 0
    endfunction

    function SetAbilityManaCostAddr takes integer add, integer level, integer mc returns nothing
        local integer a = RMem( add + 0x54 )
        if a > 0 then
            call WMem( a + level * 0x68, mc )
        endif
    endfunction

    function SetAbilityCD takes integer abil, integer level, real cool returns nothing
        local integer a = GetObjectDataCaching( pAbilityData, abil )
        if a > 0 then
            set a = RMem( a + 0x54 )
            if a > 0 then
                call WMem( a - 0x54 + level * 0x68, mR2I( cool ) )
            endif
        endif
    endfunction

    function GetAbilityCD takes integer abil, integer level returns real
        local integer a = GetObjectDataCaching( pAbilityData, abil )
        if abil == 'A1P8'then//DotA - specific, charge of darkness
            return 12.
        endif
        if a > 0 then
            set a = RMem( a + 0x54 )
            if a > 0 then
                return mI2R( RMem( a - 0x54 + level * 0x68 ) )
            endif
        endif
        return 0.
    endfunction

    function GetAbilityMaxLevel takes integer abil returns integer
        local integer a
        if abil == 0 then
            return 0
        endif
        set a = GetObjectDataCaching( pAbilityData, abil )
        if a > 0 then
            return RMem( a + 0x50 )
        endif
        return 0
    endfunction

    function AddAbilityCooldownConverted takes integer a, real seconds returns nothing
        local integer pData = RMem( a + 0xDC )
        if pData > 0 then
            call WMem( pData + 4, mR2I( seconds + mI2R( RMem( pData + 4 ) ) ) )
        endif
    endfunction

    function GetAbilityCurrentCooldownConverted takes integer a returns real
        local integer pData = RMem( a + 0xDC )
        if pData > 0 then
            return mI2R( RMem( pData + 4 ) ) - mI2R( RMem( RMem( pData + 0xC ) + 0x40 ) )
        endif
        return .0
    endfunction

//function GetRealGameTime takes nothing returns integer 
//desync-able, do not use
//returns ms value (1s = 1000 here)
//	return RMem(pGameTime)
//endfunction

    function IsAbilityOnCooldown takes integer a returns boolean
        return IsFlagBitSet( RMem( a + 0x20 ), 512 )
    endfunction

    function SetAbilityDisabled takes integer pAbility, integer count returns nothing
        if pAbility > 0 then
            call WMem( pAbility + 0x3C, count )
        endif
	//not safe unless used with PauseUnit. Button will be blacked, but current casts of that ability won’t be interrupted.
    endfunction

    function GetAbilityDisabledCount takes integer pAbility returns integer
        if pAbility > 0 then
            return RMem( pAbility + 0x3C )
        endif
        return 0
    endfunction

    function SetAbilityHidden takes integer pAbility, integer count returns nothing
        call WMem( pAbility + 0x40, count )
	//This one is 100% safe. This hides the ability button, and order can’t be issued.
    endfunction

    function AddAbilityHidden takes integer a, integer d returns nothing
        call WMem( a + 0x40, RMem( a + 0x40 ) + d )
    endfunction

    function SetAbilityDisabled2 takes integer pAbility, integer count returns nothing
        call WMem( pAbility + 0x44, count )
	//This one is used by Orb of Slow or Windwalk. Button is blacked, but cooldown is stil displayed.
    endfunction

    function GetAbilityDisabled2 takes integer pAbility returns integer
        return RMem( pAbility + 0x44 )
    endfunction

    function DisableUnitsMovement takes unit u, boolean disable returns nothing
        local integer i = 2
        local integer a = GetHandleId( u )
        if a < 1 then
            return
        endif
        if disable == false then
            set i = 1
        endif
        call PauseUnit( u, true )
        set a = ConvertHandle( u )
        if a > 0 then
            set a = RMem( a + 0x1EC )
            if a > 0 then
                call SetAbilityDisabled( a, i )
            endif
        endif
        call PauseUnit( u, false )
    endfunction
//pointer to 'Amov' is located at offset 123 of unit object, Aatk is at offset 122, and AInv is offset 124

//Hides all command buttons and sets the Ward flag. Unit will keep its current order, and player can’t give new orders
//Notice the the unit can’t be ordered with triggers as well. To issue an order you need to temporarily reenable control
    function DisableUnitControl takes unit u returns nothing
        local integer pUnit = ConvertHandle( u )
        local integer flags
        local integer Amov
        local integer Aatk
        local integer AInv
        if pUnit > 0 then
            set flags = RMem( pUnit + 0x248 )
            set Amov = RMem( pUnit + 0x1EC )
            set Aatk = RMem( pUnit + 0x1E8 )
            set AInv = RMem( pUnit + 0x1F8 )
	//	call echo("disabled on "+GetUnitName(u))
            if not IsFlagBitSet( flags, 512 ) then
                call WMem( pUnit + 0x248, flags + 512 )
            endif
            if Amov > 0 then
                call WMem( Amov + 0x40, RMem( Amov + 0x40 ) + 1 )
            endif
            if Aatk > 0 then
                call WMem( Aatk + 0x40, RMem( Aatk + 0x40 ) + 1 )
            endif
            if AInv > 0 then
                call WMem( AInv + 0x3C, RMem( AInv + 0x3C ) + 1 )
            endif
		
        endif
    endfunction

//Removes the Ward flag and reenables Amov and Aatk
    function EnableUnitControl takes unit u returns nothing
        local integer pUnit = ConvertHandle( u )
        local integer flags
        local integer Amov
        local integer Aatk
        local integer AInv
        if pUnit > 0 then
            set flags = RMem( pUnit + 0x248 )
            set Amov = RMem( pUnit + 0x1EC )
            set Aatk = RMem( pUnit + 0x1E8 )
            set AInv = RMem( pUnit + 0x1F8 )
	//	call echo("disabled on "+GetUnitName(u))
            if IsFlagBitSet( flags, 512 ) then
                call WMem( pUnit + 0x248, flags - 512 )
            endif
            if Amov > 0 then
                call WMem( Amov + 0x40, RMem( Amov + 0x40 ) - 1 )
            endif
            if Aatk > 0 then
                call WMem( Aatk + 0x40, RMem( Aatk + 0x40 ) - 1 )
            endif
            if AInv > 0 then
                call WMem( AInv + 0x3C, RMem( AInv + 0x3C ) - 1 )
            endif
        endif
    endfunction

    function SetUnitPortrait takes integer uiobjectaddr, string s returns nothing
        call WriteNullTerminatedString( s, uiobjectaddr + 0x34 )
    endfunction

    function SetUnitModel takes integer uiobjectaddr, string s returns nothing
        call WriteNullTerminatedString( s, uiobjectaddr + 0x30 )
    endfunction

    function SetUnitModelUFAddress takes integer address, string s returns nothing
        call SetUnitModel( address, s )
    endfunction

    function GetUnitAttackAbilityForAddress takes integer pConvertedHandle returns integer
        return RMem( pConvertedHandle + 0x1E8 )
    endfunction

    function GetUnitAttackAbility takes unit u returns integer
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            return GetUnitAttackAbilityForAddress( LastConvertedHandle )
        endif
        return 0
    endfunction

    function SetUnitAttackAbilityForAddress takes integer pConvertedHandle, integer pAddr returns nothing
        call WMem( pConvertedHandle + 0x1E8, pAddr )
    endfunction

    function SetUnitAttackAbility takes unit u , integer pAddr returns nothing
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            call SetUnitAttackAbilityForAddress( LastConvertedHandle, pAddr )
        endif
    endfunction

    function GetUnitMoveAbilityForAddress takes integer pConvertedHandle returns integer
        return RMem( pConvertedHandle + 0x1EC )
    endfunction

    function GetUnitMoveAbility takes unit u returns integer
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            return GetUnitMoveAbilityForAddress( LastConvertedHandle )
        endif
        return 0
    endfunction

    function SetUnitMoveAbilityForAddress takes integer pConvertedHandle, integer pAddr returns nothing
        call WMem( pConvertedHandle + 0x1EC, pAddr )
    endfunction

    function SetUnitMoveAbility takes unit u, integer pAddr returns nothing
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            call SetUnitMoveAbilityForAddress( LastConvertedHandle, pAddr )
        endif
    endfunction

    function GetUnitHeroAbilityForAddress takes integer pConvertedHandle returns integer
        return RMem( pConvertedHandle + 0x1F0 )
    endfunction

    function GetUnitHeroAbility takes unit u returns integer
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            return GetUnitHeroAbilityForAddress( LastConvertedHandle )
        endif
        return 0
    endfunction

    function GetUnitBuildAbilityForAddress takes integer pConvertedHandle returns integer
        return RMem( pConvertedHandle + 0x1F4 )
    endfunction

    function GetUnitBuildAbility takes unit u returns integer
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            return GetUnitBuildAbilityForAddress( LastConvertedHandle )
        endif
        return 0
    endfunction

    function GetUnitInventoryAbilityForAddress takes integer pConvertedHandle returns integer
        return RMem( pConvertedHandle + 0x1F8 )
    endfunction

    function GetUnitInventoryAbility takes unit u returns integer
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            return GetUnitInventoryAbilityForAddress( LastConvertedHandle )
        endif
        return 0
    endfunction


// Alternative for sub_6F4786B0 (126a)
    function GetSomeAddress takes integer pAddr1 , integer pAddr2 returns integer
//I just split your function into 2, it should be working as before
        local integer pOff1 = 0x2C
        if pAddr1 == -1 and pAddr2 == -1 then
            return 0
        endif
        if pAddr1 >= 0 then
            set pOff1 = 0xC
        endif
        set pOff1 = RMem( pGameClass1 ) + pOff1
        set pOff1 = RMem( pOff1 )
        if pOff1 == 0 then
            return 0
        endif
	
        set pOff1 = RMem( pOff1 + 8 * pAddr1 + 4 )
        if pOff1 == 0 or RMem( pOff1 + 0x18 ) != pAddr2 then
            return 0
        endif
        return pOff1
    endfunction

    function GetSomeAddressForAbility takes integer pAddr1 , integer pAddr2 returns integer //Second part of GetSomeAddressForAbility
        local integer pOff1 = GetSomeAddress( pAddr1, pAddr2 )
        if pOff1 == 0 or RMem( pOff1 + 0x20 ) != 0 then
            return 0
        endif
        return RMem( pOff1 + 0x54 )
    endfunction

    function GetSomeAddressForLocustFlags takes integer pAddr1 , integer pAddr2 returns integer
        local integer i = GetSomeAddress( pAddr1, pAddr2 )
        return RMem( i + 0x94 )
    endfunction

    function SetLocustFlags takes unit u, integer i returns nothing //These flags can make unit immune to truesight
        local integer pOff1
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            set LastConvertedHandle = LastConvertedHandle + 0x16C
            set pOff1 = GetSomeAddressForLocustFlags( RMem( LastConvertedHandle ), RMem( LastConvertedHandle + 4 ) )
            if pOff1 > 0 then
                call WMem( pOff1 + 0x34, i )
            endif
        endif
    endfunction

    function EnableTruesightImmunity takes unit u returns nothing
//I don’t really know what other side effects may be caused by this, at least GroupEnum is not affected
        call SetLocustFlags( u, 0x08000000 )
    endfunction

    function DisableTruesightImmunity takes unit u returns nothing
        call SetLocustFlags( u, 0 )
    endfunction

    function UnStunUnit takes unit u returns nothing
	//unsafe, do not use unless you tested it through
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            call WMem( LastConvertedHandle + 0x198, 0 )
        endif
    endfunction

    function IsUnitStunned2 takes unit u returns boolean
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            return RMem( LastConvertedHandle + 0x198 ) > 0
        endif
        return false
    endfunction

    function IsUnitInvulnerable takes unit u returns boolean // проверяет только флаг неуязвимости
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            return IsFlagBitSet( RMem( LastConvertedHandle + 0x20 ), 8 )
        endif
        return false
    endfunction

    function IsUnitInvulnerable2 takes unit u returns boolean // проверяет только счетчик неуязвимости
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            return RMem( LastConvertedHandle + 0xE8 ) > 0
        endif
        return false
    endfunction

    function GetUnitInvulnerableCounter takes unit u returns integer
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            return RMem( LastConvertedHandle + 0xE8 )
        endif
        return 0
    endfunction

    function SetUnitInvulnerableCounter takes unit u, integer i returns nothing
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            call WMem( LastConvertedHandle + 0xE8, i )
        endif
    endfunction

    function ModifyInvulnerableCounter takes unit u, integer diff returns nothing
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            call WMem( LastConvertedHandle + 0xE8, RMem( LastConvertedHandle + 0xE8 ) + diff )
        endif
    endfunction

    function GetUnitAbilityForAddresss takes integer pConvertedHandle, integer abilid returns integer
        local integer pAddr1 = pConvertedHandle + 0x1DC
        local integer pAddr2 = pConvertedHandle + 0x1E0
        local integer pOff1 = 0
        set pAddr1 = RMem( pAddr1 )
        set pAddr2 = RMem( pAddr2 )
        if pAddr1 == 0 or pAddr2 == 0 or ( pAddr1 == -1 and pAddr2 == -1 ) then
            return 0
        endif
        set pOff1 = GetSomeAddressForAbility( pAddr1, pAddr2 )
        loop
            exitwhen pOff1 <= 0
            if RMem( pOff1 + 0x34 ) == abilid then
                return pOff1
            endif
            set pOff1 = GetSomeAddressForAbility( RMem( pOff1 + 0x24 ), RMem( pOff1 + 0x28 ) )
        endloop
        return pOff1
    endfunction

    function GetAbilityOrderID takes integer pAbility returns integer
        local integer pOffset2
        if pAbility < 1 then
            return 0
        endif
//	call BJDebugMsg(Int2Hex(pAbility)+" sent")
//	call PolledWait(1.)

	//  mov ecx,[esp+04]
	//  mov edx,[ecx+6C]
	//  cmp edx,D0142 { 852290 }
	//  je 0493413A
	//  mov eax,00000000 { 0 }
	//  ret 
	//  mov ecx,[ecx]
	//  mov ecx,[ecx+00000308]
	//  call ecx
	//  ret 
	
        if RMem( pGetAbilityOrderID ) == 0 then
            call WMem( pGetAbilityOrderID, 0x04244C8B )
            call WMem( pGetAbilityOrderID + 4, 0x816C518B )
            call WMem( pGetAbilityOrderID + 8, 0x0D0142FA )
            call WMem( pGetAbilityOrderID + 12, 0xB8067400 )
            call WMem( pGetAbilityOrderID + 16, 0x00000000 )
            call WMem( pGetAbilityOrderID + 20, 0x8B098BC3 )
            call WMem( pGetAbilityOrderID + 24, 0x00030889 )
            call WMem( pGetAbilityOrderID + 28, 0x90E1FF00 )
        endif
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pGetAbilityOrderID )
        else
            call WMem( pIgnoredUnitsOffset, pGetAbilityOrderID )
        endif
	

        if pIgnoredUnitsOffset != 0 then
            set pOffset2 = IgnoredUnits( pAbility )
            call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
            return pOffset2
        endif
	
        return 0
    endfunction

    function PrintAllUnitAbilities takes integer pConvertedHandle returns nothing
        local integer pAddr1 = pConvertedHandle + 476
        local integer pAddr2 = pConvertedHandle + 480

        local integer pOff1 = 0

        set pAddr1 = RMem( pAddr1 )
        set pAddr2 = RMem( pAddr2 )
        if pAddr1 == 0 or pAddr2 == 0 or BitwiseAnd( pAddr1, pAddr2 ) == -1 then
            return
        endif

        set pOff1 = GetSomeAddressForAbility( pAddr1, pAddr2 )
	
        if pOff1 == 0 then
            return
        endif
	
        loop
            exitwhen pOff1 == 0

            call DisplayTimedTextToPlayer( GetLocalPlayer( ), 0.0, 0.0, 40, "Address:" + Int2Hex( pOff1 ) + ". ID:" + Id2String( RMem( pOff1 + 52 ) ) + " name: " + GetObjectName( RMem( pOff1 + 52 ) ) )
		
            set pOff1 = GetSomeAddressForAbility( RMem( pOff1 + 36 ), RMem( pOff1 + 40 ) )
        endloop
	
    endfunction

    function GetAllUnitAbilities takes unit u returns nothing
        local integer pConvertedHandle = ConvertHandle( u )
        local integer pAddr1
        local integer pAddr2
        local integer i = 0
        local integer h = GetHandleId( u )
        local integer pOff1 = 0
        local integer id
        call FlushChildHashtable( gg_htb_HashData, h )
        if pConvertedHandle < 1 then
            return
        endif
        set pAddr1 = pConvertedHandle + 0x1DC
        set pAddr2 = pConvertedHandle + 0x1E0
        set pAddr1 = RMem( pAddr1 )
        set pAddr2 = RMem( pAddr2 )
        if ( pAddr1 == -1 and pAddr2 == -1 ) or pAddr1 == 0 or pAddr2 == 0 then
            return
        endif
        set pOff1 = GetSomeAddressForAbility( pAddr1, pAddr2 )
        loop
            exitwhen pOff1 <= 0
            set id = RMem( pOff1 + 0x34 )
            if id != 'Amov' and id != 'AHer' and id != 'Aatk' and id != 'AInv' then
                call SaveInteger( gg_htb_HashData, h, i, pOff1 )//address
                call SaveInteger( gg_htb_HashData, h + 1, i, RMem( pOff1 + 0x34 ) )//ability id
                set i = i + 1
            endif
            set pOff1 = GetSomeAddressForAbility( RMem( pOff1 + 36 ), RMem( pOff1 + 40 ) )
        endloop
        call SaveInteger( gg_htb_HashData, 'abil', 0, i )
    endfunction


    function CallFastCallWith1Args takes integer pFuncFastcallAddr, integer arg1 returns integer
        local integer pOffset1
        if RMem( pCallFastCallWith1Args ) == 0 then
            call WMem( pCallFastCallWith1Args, 0xB9F68B56 )
            call WMem( pCallFastCallWith1Args + 8, 0xBEF68B90 )
            call WMem( pCallFastCallWith1Args + 16, 0xC35ED6FF )
        endif
        call WMem( pCallFastCallWith1Args + 4, arg1 )
        call WMem( pCallFastCallWith1Args + 12, pFuncFastcallAddr )
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallFastCallWith1Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallFastCallWith1Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction


    function CallFastCallWith2Args takes integer pFuncFastcallAddr, integer arg1, integer arg2 returns integer
        local integer pOffset1
        if RMem( pCallFastCallWith2Args ) == 0 then
            call WMem( pCallFastCallWith2Args, 0xBAF68B56 )
            call WMem( pCallFastCallWith2Args + 8, 0xB9F68B90 )
            call WMem( pCallFastCallWith2Args + 16, 0xBEF68B90 )
            call WMem( pCallFastCallWith2Args + 24, 0xC35ED6FF )
        endif
        call WMem( pCallFastCallWith2Args + 4, arg2 )
        call WMem( pCallFastCallWith2Args + 12, arg1 )
        call WMem( pCallFastCallWith2Args + 20, pFuncFastcallAddr )
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallFastCallWith2Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallFastCallWith2Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction


    function CallFastCallWith3Args takes integer pFuncFastcallAddr, integer arg1, integer arg2, integer arg3 returns integer
        local integer pOffset1
        if RMem( pCallFastCallWith3Args ) == 0 then
            call WMem( pCallFastCallWith3Args, 0x68F68B56 )
            call WMem( pCallFastCallWith3Args + 8, 0xBAF68B90 )
            call WMem( pCallFastCallWith3Args + 16, 0xB9F68B90 )
            call WMem( pCallFastCallWith3Args + 24, 0xBEF68B90 )
            call WMem( pCallFastCallWith3Args + 32, 0xC35ED6FF )
        endif
        call WMem( pCallFastCallWith3Args + 4, arg3 )
        call WMem( pCallFastCallWith3Args + 12, arg2 )
        call WMem( pCallFastCallWith3Args + 20, arg1 )
        call WMem( pCallFastCallWith3Args + 28, pFuncFastcallAddr )
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallFastCallWith3Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallFastCallWith3Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function FUCKINGCallWith4Args takes integer pFuncFastcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4 returns integer
        local integer pOffset1
        if RMem( pFUCKINGCallWith4Args ) == 0 then
            call WMem( pFUCKINGCallWith4Args, 0x68F68B56 )
            call WMem( pFUCKINGCallWith4Args + 8, 0x68F68B90 )
            call WMem( pFUCKINGCallWith4Args + 16, 0xB8F68B90 )
            call WMem( pFUCKINGCallWith4Args + 24, 0xBFF68B90 )
            call WMem( pFUCKINGCallWith4Args + 32, 0xBEF68B90 )
            call WMem( pFUCKINGCallWith4Args + 40, 0xC35ED6FF )
        endif
        call WMem( pFUCKINGCallWith4Args + 4, arg4 )
        call WMem( pFUCKINGCallWith4Args + 12, arg3 )
        call WMem( pFUCKINGCallWith4Args + 20, arg2 )
        call WMem( pFUCKINGCallWith4Args + 28, arg1 )
        call WMem( pFUCKINGCallWith4Args + 36, pFuncFastcallAddr )
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pFUCKINGCallWith4Args )
        else
            call WMem( pIgnoredUnitsOffset, pFUCKINGCallWith4Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallFastCallWith4Args takes integer pFuncFastcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4 returns integer
        local integer pOffset1
        if RMem( pCallFastCallWith4Args ) == 0 then
            call WMem( pCallFastCallWith4Args, 0x68F68B56 )
            call WMem( pCallFastCallWith4Args + 8, 0x68F68B90 )
            call WMem( pCallFastCallWith4Args + 16, 0xBAF68B90 )
            call WMem( pCallFastCallWith4Args + 24, 0xB9F68B90 )
            call WMem( pCallFastCallWith4Args + 32, 0xBEF68B90 )
            call WMem( pCallFastCallWith4Args + 40, 0xC35ED6FF )
        endif
        call WMem( pCallFastCallWith4Args + 4, arg4 )
        call WMem( pCallFastCallWith4Args + 12, arg3 )
        call WMem( pCallFastCallWith4Args + 20, arg2 )
        call WMem( pCallFastCallWith4Args + 28, arg1 )
        call WMem( pCallFastCallWith4Args + 36, pFuncFastcallAddr )
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallFastCallWith4Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallFastCallWith4Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( 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
        if RMem( pCallFastCallWith5Args ) == 0 then
            call WMem( pCallFastCallWith5Args, 0x68F68B56 )
            call WMem( pCallFastCallWith5Args + 8, 0x68F68B90 )
            call WMem( pCallFastCallWith5Args + 16, 0x68F68B90 )
            call WMem( pCallFastCallWith5Args + 24, 0xBAF68B90 )
            call WMem( pCallFastCallWith5Args + 32, 0xB9F68B90 )
            call WMem( pCallFastCallWith5Args + 40, 0xBEF68B90 )
            call WMem( pCallFastCallWith5Args + 48, 0xC35ED6FF )
        endif
        call WMem( pCallFastCallWith5Args + 4, arg5 )
        call WMem( pCallFastCallWith5Args + 12, arg4 )
        call WMem( pCallFastCallWith5Args + 20, arg3 )
        call WMem( pCallFastCallWith5Args + 28, arg2 )
        call WMem( pCallFastCallWith5Args + 36, arg1 )
        call WMem( pCallFastCallWith5Args + 44, pFuncFastcallAddr )
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallFastCallWith5Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallFastCallWith5Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( 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
        if RMem( pCallFastCallWith6Args ) == 0 then
            call WMem( pCallFastCallWith6Args, 0x68F68B56 )
            call WMem( pCallFastCallWith6Args + 8, 0x68F68B90 )
            call WMem( pCallFastCallWith6Args + 16, 0x68F68B90 )
            call WMem( pCallFastCallWith6Args + 24, 0x68F68B90 )
            call WMem( pCallFastCallWith6Args + 32, 0xBAF68B90 )
            call WMem( pCallFastCallWith6Args + 40, 0xB9F68B90 )
            call WMem( pCallFastCallWith6Args + 48, 0xBEF68B90 )
            call WMem( pCallFastCallWith6Args + 56, 0xC35ED6FF )
        endif
        call WMem( pCallFastCallWith6Args + 4, arg6 )
        call WMem( pCallFastCallWith6Args + 12, arg5 )
        call WMem( pCallFastCallWith6Args + 20, arg4 )
        call WMem( pCallFastCallWith6Args + 28, arg3 )
        call WMem( pCallFastCallWith6Args + 36, arg2 )
        call WMem( pCallFastCallWith6Args + 44, arg1 )
        call WMem( pCallFastCallWith6Args + 52, pFuncFastcallAddr )
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallFastCallWith6Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallFastCallWith6Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( 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
        if RMem( pCallFastCallWith7Args ) == 0 then
            call WMem( pCallFastCallWith7Args, 0x68F68B56 )
            call WMem( pCallFastCallWith7Args + 8, 0x68F68B90 )
            call WMem( pCallFastCallWith7Args + 16, 0x68F68B90 )
            call WMem( pCallFastCallWith7Args + 24, 0x68F68B90 )
            call WMem( pCallFastCallWith7Args + 32, 0x68F68B90 )
            call WMem( pCallFastCallWith7Args + 40, 0xBAF68B90 )
            call WMem( pCallFastCallWith7Args + 48, 0xB9F68B90 )
            call WMem( pCallFastCallWith7Args + 56, 0xBEF68B90 )
            call WMem( pCallFastCallWith7Args + 64, 0xC35ED6FF )
        endif
        call WMem( pCallFastCallWith7Args + 4, arg7 )
        call WMem( pCallFastCallWith7Args + 12, arg6 )
        call WMem( pCallFastCallWith7Args + 20, arg5 )
        call WMem( pCallFastCallWith7Args + 28, arg4 )
        call WMem( pCallFastCallWith7Args + 36, arg3 )
        call WMem( pCallFastCallWith7Args + 44, arg2 )
        call WMem( pCallFastCallWith7Args + 52, arg1 )
        call WMem( pCallFastCallWith7Args + 60, pFuncFastcallAddr )
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallFastCallWith7Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallFastCallWith7Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( 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
        if RMem( pCallFastCallWith8Args ) == 0 then
            call WMem( pCallFastCallWith8Args, 0x68F68B56 )
            call WMem( pCallFastCallWith8Args + 8, 0x68F68B90 )
            call WMem( pCallFastCallWith8Args + 16, 0x68F68B90 )
            call WMem( pCallFastCallWith8Args + 24, 0x68F68B90 )
            call WMem( pCallFastCallWith8Args + 32, 0x68F68B90 )
            call WMem( pCallFastCallWith8Args + 40, 0x68F68B90 )
            call WMem( pCallFastCallWith8Args + 48, 0xBAF68B90 )
            call WMem( pCallFastCallWith8Args + 56, 0xB9F68B90 )
            call WMem( pCallFastCallWith8Args + 64, 0xBEF68B90 )
            call WMem( pCallFastCallWith8Args + 72, 0xC35ED6FF )
        endif
        call WMem( pCallFastCallWith8Args + 4, arg8 )
        call WMem( pCallFastCallWith8Args + 12, arg7 )
        call WMem( pCallFastCallWith8Args + 20, arg6 )
        call WMem( pCallFastCallWith8Args + 28, arg5 )
        call WMem( pCallFastCallWith8Args + 36, arg4 )
        call WMem( pCallFastCallWith8Args + 44, arg3 )
        call WMem( pCallFastCallWith8Args + 52, arg2 )
        call WMem( pCallFastCallWith8Args + 60, arg1 )
        call WMem( pCallFastCallWith8Args + 68, pFuncFastcallAddr )
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallFastCallWith8Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallFastCallWith8Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallFastCallWith11Args takes integer pFuncFastcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4, integer arg5, integer arg6, integer arg7, integer arg8, integer arg9, integer arg10, integer arg11 returns integer
        local integer pOffset1
        if RMem( pCallFastCallWith11Args ) == 0 then
            call WMem( pCallFastCallWith11Args, 0x68F68B56 )
            call WMem( pCallFastCallWith11Args + 8, 0x68F68B90 )
            call WMem( pCallFastCallWith11Args + 16, 0x68F68B90 )
            call WMem( pCallFastCallWith11Args + 24, 0x68F68B90 )
            call WMem( pCallFastCallWith11Args + 32, 0x68F68B90 )
            call WMem( pCallFastCallWith11Args + 40, 0x68F68B90 )
            call WMem( pCallFastCallWith11Args + 48, 0x68F68B90 )
            call WMem( pCallFastCallWith11Args + 56, 0x68F68B90 )
            call WMem( pCallFastCallWith11Args + 64, 0x68F68B90 )
            call WMem( pCallFastCallWith11Args + 72, 0xBAF68B90 )
            call WMem( pCallFastCallWith11Args + 80, 0xB9F68B90 )
            call WMem( pCallFastCallWith11Args + 88, 0xBEF68B90 )
            call WMem( pCallFastCallWith11Args + 96, 0xC35ED6FF )
        endif
        call WMem( pCallFastCallWith11Args + 4, arg11 )
        call WMem( pCallFastCallWith11Args + 12, arg10 )
        call WMem( pCallFastCallWith11Args + 20, arg9 )
        call WMem( pCallFastCallWith11Args + 28, arg8 )
        call WMem( pCallFastCallWith11Args + 36, arg7 )
        call WMem( pCallFastCallWith11Args + 44, arg6 )
        call WMem( pCallFastCallWith11Args + 52, arg5 )
        call WMem( pCallFastCallWith11Args + 60, arg4 )
        call WMem( pCallFastCallWith11Args + 68, arg3 )
        call WMem( pCallFastCallWith11Args + 76, arg2 )
        call WMem( pCallFastCallWith11Args + 84, arg1 )
        call WMem( pCallFastCallWith11Args + 92, pFuncFastcallAddr )
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallFastCallWith11Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallFastCallWith11Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallFastCallWith12Args takes integer pFuncFastcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4, integer arg5, integer arg6, integer arg7, integer arg8, integer arg9, integer arg10, integer arg11, integer arg12 returns integer
        local integer pOffset1
        if RMem( pCallFastCallWith12Args ) == 0 then
            call WMem( pCallFastCallWith12Args, 0x68F68B56 )
            call WMem( pCallFastCallWith12Args + 8, 0x68F68B90 )
            call WMem( pCallFastCallWith12Args + 16, 0x68F68B90 )
            call WMem( pCallFastCallWith12Args + 24, 0x68F68B90 )
            call WMem( pCallFastCallWith12Args + 32, 0x68F68B90 )
            call WMem( pCallFastCallWith12Args + 40, 0x68F68B90 )
            call WMem( pCallFastCallWith12Args + 48, 0x68F68B90 )
            call WMem( pCallFastCallWith12Args + 56, 0x68F68B90 )
            call WMem( pCallFastCallWith12Args + 64, 0x68F68B90 )
            call WMem( pCallFastCallWith12Args + 72, 0x68F68B90 )
            call WMem( pCallFastCallWith12Args + 80, 0xBAF68B90 )
            call WMem( pCallFastCallWith12Args + 88, 0xB9F68B90 )
            call WMem( pCallFastCallWith12Args + 96, 0xBEF68B90 )
            call WMem( pCallFastCallWith12Args + 104, 0xC35ED6FF )
        endif
        call WMem( pCallFastCallWith12Args + 4, arg12 )
        call WMem( pCallFastCallWith12Args + 12, arg11 )
        call WMem( pCallFastCallWith12Args + 20, arg10 )
        call WMem( pCallFastCallWith12Args + 28, arg9 )
        call WMem( pCallFastCallWith12Args + 36, arg8 )
        call WMem( pCallFastCallWith12Args + 44, arg7 )
        call WMem( pCallFastCallWith12Args + 52, arg6 )
        call WMem( pCallFastCallWith12Args + 60, arg5 )
        call WMem( pCallFastCallWith12Args + 68, arg4 )
        call WMem( pCallFastCallWith12Args + 76, arg3 )
        call WMem( pCallFastCallWith12Args + 84, arg2 )
        call WMem( pCallFastCallWith12Args + 92, arg1 )
        call WMem( pCallFastCallWith12Args + 100, pFuncFastcallAddr )
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallFastCallWith12Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallFastCallWith12Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( 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 CallThisCallWith10Args takes integer pFuncThiscallAddr, integer arg1, integer arg2, integer arg3, integer arg4, integer arg5, integer arg6, integer arg7, integer arg8, integer arg9, integer arg10 returns integer
        return CallFastCallWith11Args( pFuncThiscallAddr, arg1, 0, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10 )
    endfunction

    function CallThisCallWith11Args takes integer pFuncThiscallAddr, integer arg1, integer arg2, integer arg3, integer arg4, integer arg5, integer arg6, integer arg7, integer arg8, integer arg9, integer arg10, integer arg11 returns integer
        return CallFastCallWith12Args( pFuncThiscallAddr, arg1, 0, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11 )
    endfunction
    
    function CallStdcallWith1Args takes integer pFuncStdcallAddr, integer arg1 returns integer
        local integer pOffset1
        if RMem( pCallStdcallWith1Args ) == 0 then
            call WMem( pCallStdcallWith1Args, 0x68C98B51 ) // push ecx. mov ecx, ecx
            call WMem( pCallStdcallWith1Args + 8, 0xB990C98B ) // mov ecx, ecx , nop
            call WMem( pCallStdcallWith1Args + 16, 0xC359D1FF ) // call ecx, pop ecx, ret
        endif
        call WMem( pCallStdcallWith1Args + 4, arg1 ) // push arg1
        call WMem( pCallStdcallWith1Args + 12, pFuncStdcallAddr ) // mov ecx, pFuncStdcallAddr
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallStdcallWith1Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallStdcallWith1Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallStdcallWith2Args takes integer pFuncStdcallAddr, integer arg1, integer arg2 returns integer
        local integer pOffset1
        if RMem( pCallStdcallWith2Args ) == 0 then
            call WMem( pCallStdcallWith2Args, 0x68C98B51 ) // push ecx. mov ecx, ecx
            call WMem( pCallStdcallWith2Args + 8, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith2Args + 16, 0xB990C98B ) // mov ecx, ecx , nop
            call WMem( pCallStdcallWith2Args + 24, 0xC359D1FF ) // call ecx, pop ecx, ret
        endif
        call WMem( pCallStdcallWith2Args + 4, arg2 ) // push arg2
        call WMem( pCallStdcallWith2Args + 12, arg1 ) // push arg1
        call WMem( pCallStdcallWith2Args + 20, pFuncStdcallAddr ) // mov ecx, pFuncStdcallAddr
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallStdcallWith2Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallStdcallWith2Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallStdcallWith3Args takes integer pFuncStdcallAddr, integer arg1, integer arg2, integer arg3 returns integer
        local integer pOffset1
        if RMem( pCallStdcallWith3Args ) == 0 then
            call WMem( pCallStdcallWith3Args, 0x68C98B51 ) // push ecx. mov ecx, ecx
            call WMem( pCallStdcallWith3Args + 8, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith3Args + 16, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith3Args + 24, 0xB990C98B ) // mov ecx, ecx , nop
            call WMem( pCallStdcallWith3Args + 32, 0xC359D1FF ) // call ecx, pop ecx, ret
        endif
        call WMem( pCallStdcallWith3Args + 4, arg3 ) // push arg3
        call WMem( pCallStdcallWith3Args + 12, arg2 ) // push arg2
        call WMem( pCallStdcallWith3Args + 20, arg1 ) // push arg1
        call WMem( pCallStdcallWith3Args + 28, pFuncStdcallAddr ) // mov ecx, pFuncStdcallAddr
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallStdcallWith3Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallStdcallWith3Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallStdcallWith4Args takes integer pFuncStdcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4 returns integer
        local integer pOffset1
        if RMem( pCallStdcallWith4Args ) == 0 then
            call WMem( pCallStdcallWith4Args, 0x68C98B51 ) // push ecx. mov ecx, ecx
            call WMem( pCallStdcallWith4Args + 8, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith4Args + 16, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith4Args + 24, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith4Args + 32, 0xB990C98B ) // mov ecx, ecx , nop
            call WMem( pCallStdcallWith4Args + 40, 0xC359D1FF ) // call ecx, pop ecx, ret
        endif
        call WMem( pCallStdcallWith4Args + 4, arg4 ) // push arg4
        call WMem( pCallStdcallWith4Args + 12, arg3 ) // push arg3
        call WMem( pCallStdcallWith4Args + 20, arg2 ) // push arg2
        call WMem( pCallStdcallWith4Args + 28, arg1 ) // push arg1
        call WMem( pCallStdcallWith4Args + 36, pFuncStdcallAddr ) // mov ecx, pFuncStdcallAddr
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallStdcallWith4Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallStdcallWith4Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallStdcallWith5Args takes integer pFuncStdcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4, integer arg5 returns integer
        local integer pOffset1
        if RMem( pCallStdcallWith5Args ) == 0 then
            call WMem( pCallStdcallWith5Args, 0x68C98B51 ) // push ecx. mov ecx, ecx
            call WMem( pCallStdcallWith5Args + 8, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith5Args + 16, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith5Args + 24, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith5Args + 32, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith5Args + 40, 0xB990C98B ) // mov ecx, ecx , nop
            call WMem( pCallStdcallWith5Args + 48, 0xC359D1FF ) // call ecx, pop ecx, ret
        endif
        call WMem( pCallStdcallWith5Args + 4, arg5 ) // push arg5
        call WMem( pCallStdcallWith5Args + 12, arg4 ) // push arg4
        call WMem( pCallStdcallWith5Args + 20, arg3 ) // push arg3
        call WMem( pCallStdcallWith5Args + 28, arg2 ) // push arg2
        call WMem( pCallStdcallWith5Args + 36, arg1 ) // push arg1
        call WMem( pCallStdcallWith5Args + 44, pFuncStdcallAddr ) // mov ecx, pFuncStdcallAddr
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallStdcallWith5Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallStdcallWith5Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallStdcallWith6Args takes integer pFuncStdcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4, integer arg5 , integer arg6 returns integer
        local integer pOffset1
        if RMem( pCallStdcallWith6Args ) == 0 then
            call WMem( pCallStdcallWith6Args, 0x68C98B51 ) // push ecx. mov ecx, ecx
            call WMem( pCallStdcallWith6Args + 8, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith6Args + 16, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith6Args + 24, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith6Args + 32, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith6Args + 40, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith6Args + 48, 0xB990C98B ) // mov ecx, ecx , nop
            call WMem( pCallStdcallWith6Args + 56, 0xC359D1FF ) // call ecx, pop ecx, ret
        endif
        call WMem( pCallStdcallWith6Args + 4, arg6 ) // push arg6
        call WMem( pCallStdcallWith6Args + 12, arg5 ) // push arg5
        call WMem( pCallStdcallWith6Args + 20, arg4 ) // push arg4
        call WMem( pCallStdcallWith6Args + 28, arg3 ) // push arg3
        call WMem( pCallStdcallWith6Args + 36, arg2 ) // push arg2
        call WMem( pCallStdcallWith6Args + 44, arg1 ) // push arg1
        call WMem( pCallStdcallWith6Args + 52, pFuncStdcallAddr ) // mov ecx, pFuncStdcallAddr
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallStdcallWith6Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallStdcallWith6Args )
        endif
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallCdeclWith1Args takes integer pFuncCdeclAddr, integer arg1 returns integer
        local integer pOffset1
        if RMem( pCallCdeclWith1Args ) == 0 then
            call WMem( pCallCdeclWith1Args, 0x68C98B51 ) // push ecx. mov ecx, ecx
            call WMem( pCallCdeclWith1Args + 8, 0xB990C98B ) // mov ecx, ecx , nop
            call WMem( pCallCdeclWith1Args + 16, 0xC483D1FF ) // call ecx, add esp, 
            call WMem( pCallCdeclWith1Args + 20, 0xCCC35904 ) // 4, pop ecx, ret
        endif
        call WMem( pCallCdeclWith1Args + 4, arg1 ) // push arg1
        call WMem( pCallCdeclWith1Args + 12, pFuncCdeclAddr ) // mov ecx, pFuncCdeclAddr
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallCdeclWith1Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallCdeclWith1Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallCdeclWith2Args takes integer pFuncCdeclAddr, integer arg1, integer arg2 returns integer
        local integer pOffset1
        if RMem( pCallCdeclWith2Args ) == 0 then
            call WMem( pCallCdeclWith2Args, 0x68C98B51 ) // push ecx. mov ecx, ecx
            call WMem( pCallCdeclWith2Args + 8, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith2Args + 16, 0xB990C98B ) // mov ecx, ecx , nop
            call WMem( pCallCdeclWith2Args + 24, 0xC483D1FF ) // call ecx, add esp, 
            call WMem( pCallCdeclWith2Args + 28, 0xCCC35908 ) // 4, pop ecx, ret
        endif
        call WMem( pCallCdeclWith2Args + 4, arg2 ) // push arg2
        call WMem( pCallCdeclWith2Args + 12, arg1 ) // push arg1
        call WMem( pCallCdeclWith2Args + 20, pFuncCdeclAddr ) // mov ecx, pFuncCdeclAddr
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallCdeclWith2Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallCdeclWith2Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallCdeclWith3Args takes integer pFuncCdeclAddr, integer arg1, integer arg2, integer arg3 returns integer
        local integer pOffset1
        if RMem( pCallCdeclWith3Args ) == 0 then
            call WMem( pCallCdeclWith3Args, 0x68C98B51 ) // push ecx. mov ecx, ecx
            call WMem( pCallCdeclWith3Args + 8, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith3Args + 16, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith3Args + 24, 0xB990C98B ) // mov ecx, ecx , nop
            call WMem( pCallCdeclWith3Args + 32, 0xC483D1FF ) // call ecx, add esp, 
            call WMem( pCallCdeclWith3Args + 36, 0xCCC3590C ) // 4, pop ecx, ret
        endif
        call WMem( pCallCdeclWith3Args + 4, arg3 ) // push arg3
        call WMem( pCallCdeclWith3Args + 12, arg2 ) // push arg2
        call WMem( pCallCdeclWith3Args + 20, arg1 ) // push arg1
        call WMem( pCallCdeclWith3Args + 28, pFuncCdeclAddr ) // mov ecx, pFuncCdeclAddr
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallCdeclWith3Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallCdeclWith3Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallCdeclWith4Args takes integer pFuncCdeclAddr, integer arg1, integer arg2, integer arg3 , integer arg4 returns integer
        local integer pOffset1
        if RMem( pCallCdeclWith4Args ) == 0 then
            call WMem( pCallCdeclWith4Args, 0x68C98B51 ) // push ecx. mov ecx, ecx
            call WMem( pCallCdeclWith4Args + 8, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith4Args + 16, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith4Args + 24, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith4Args + 32, 0xB990C98B ) // mov ecx, ecx , nop
            call WMem( pCallCdeclWith4Args + 40, 0xC483D1FF ) // call ecx, add esp, 
            call WMem( pCallCdeclWith4Args + 44, 0xCCC35910 ) // 4, pop ecx, ret
        endif
        call WMem( pCallCdeclWith4Args + 4, arg4 ) // push arg4
        call WMem( pCallCdeclWith4Args + 12, arg3 ) // push arg3
        call WMem( pCallCdeclWith4Args + 20, arg2 ) // push arg2
        call WMem( pCallCdeclWith4Args + 28, arg1 ) // push arg1
        call WMem( pCallCdeclWith4Args + 36, pFuncCdeclAddr ) // mov ecx, pFuncCdeclAddr
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallCdeclWith4Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallCdeclWith4Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallCdeclWith5Args takes integer pFuncCdeclAddr, integer arg1, integer arg2, integer arg3 , integer arg4, integer arg5 returns integer
        local integer pOffset1
        if RMem( pCallCdeclWith5Args ) == 0 then
            call WMem( pCallCdeclWith5Args, 0x68C98B51 ) // push ecx. mov ecx, ecx
            call WMem( pCallCdeclWith5Args + 8, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith5Args + 16, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith5Args + 24, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith5Args + 32, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith5Args + 40, 0xB990C98B ) // mov ecx, ecx , nop
            call WMem( pCallCdeclWith5Args + 48, 0xC483D1FF ) // call ecx, add esp, 
            call WMem( pCallCdeclWith5Args + 52, 0xCCC35914 ) // 4, pop ecx, ret
        endif
        call WMem( pCallCdeclWith5Args + 4, arg5 ) // push arg5
        call WMem( pCallCdeclWith5Args + 12, arg4 ) // push arg4
        call WMem( pCallCdeclWith5Args + 20, arg3 ) // push arg3
        call WMem( pCallCdeclWith5Args + 28, arg2 ) // push arg2
        call WMem( pCallCdeclWith5Args + 36, arg1 ) // push arg1
        call WMem( pCallCdeclWith5Args + 44, pFuncCdeclAddr ) // mov ecx, pFuncCdeclAddr
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallCdeclWith5Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallCdeclWith5Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallCdeclWith6Args takes integer pFuncCdeclAddr, integer arg1, integer arg2, integer arg3 , integer arg4, integer arg5 , integer arg6 returns integer
        local integer pOffset1
	
        if RMem( pCallCdeclWith6Args ) == 0 then
            call WMem( pCallCdeclWith6Args, 0x68C98B51 ) // push ecx. mov ecx, ecx
            call WMem( pCallCdeclWith6Args + 8, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith6Args + 16, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith6Args + 24, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith6Args + 32, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith6Args + 40, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith6Args + 48, 0xB990C98B ) // mov ecx, ecx , nop
            call WMem( pCallCdeclWith6Args + 56, 0xC483D1FF ) // call ecx, add esp, 
            call WMem( pCallCdeclWith6Args + 60, 0xCCC35918 ) // 4, pop ecx, ret
        endif
        call WMem( pCallCdeclWith6Args + 4, arg6 ) // push arg6
        call WMem( pCallCdeclWith6Args + 12, arg5 ) // push arg5
        call WMem( pCallCdeclWith6Args + 20, arg4 ) // push arg4
        call WMem( pCallCdeclWith6Args + 28, arg3 ) // push arg3
        call WMem( pCallCdeclWith6Args + 36, arg2 ) // push arg2
        call WMem( pCallCdeclWith6Args + 44, arg1 ) // push arg1
        call WMem( pCallCdeclWith6Args + 52, pFuncCdeclAddr ) // mov ecx, pFuncCdeclAddr
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallCdeclWith6Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallCdeclWith6Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction
    
    function ConvertNullTerminatedStringToString takes integer pNullTerminatedString returns string
        if pNullTerminatedString > 0 then
            return I2SH( CallThisCallWith1Args( pConvertString, pNullTerminatedString ) )
        endif
        return null
    endfunction
    
    function GetUnitAbilityReal takes integer UnitAddress, integer AbilCode, integer unk1, integer unk2, integer unk3, integer unk4 returns integer
        return CallThisCallWith6Args( pGetUnitAbility, UnitAddress, AbilCode, unk1, unk2, unk3, unk4 )
    endfunction

    function GetUnitAddress takes unit u returns integer
        return CallThisCallWith1Args( pGetUnitAddress, GetHandleId( u ) )
    endfunction
    
    function GetModuleHandle takes string nDllName returns integer
        return CallStdcallWith1Args( RMem( pGetModuleHandle ), GetStringAddress( nDllName ) )
    endfunction

    function GetModuleProcAddress takes string nDllName, string nProcName returns integer
        return CallStdcallWith2Args( RMem( pGetProcAddress ), GetModuleHandle( nDllName ), GetStringAddress( nProcName ) )
    endfunction
    
    function GetUnitAbility takes unit u, integer abilid returns integer
        local integer a
        if u == null or abilid < 1 or GetUnitAbilityLevel( u, abilid ) == 0 then
            return 0
        endif
        set a = ConvertHandle( u )//GetUnitAddress( u )
	//call echo(Int2Hex(a)+" "+Int2Hex(ConvertHandle(u)))
        if a > 1 then
            return CallThisCallWith6Args( pGetUnitAbility, a, abilid, 0, 1, 1, 1 )
        endif
        return 0
    endfunction

    function GetUnitAbilityByBase takes unit u, integer abilid returns integer
        local integer a
        if u == null or abilid < 1 then
            return 0
        endif
        set a = ConvertHandle( u )//GetUnitAddress( u )
	//call echo(Int2Hex(a)+" "+Int2Hex(ConvertHandle(u)))
        if a > 1 then
            return CallThisCallWith6Args( pGetUnitAbility, a, abilid, 0, 0, 1, 1 )
        endif
        return 0
    endfunction

    function GetUnitAbilityByAddress takes integer u, integer abilid returns integer
        return CallThisCallWith6Args( pGetUnitAbility, u, abilid, 0, 1, 1, 1 )
    endfunction

    function GetAbilityOrderIdAny takes integer a returns integer
        local integer base = RMem( a + 0x54 )
        if base != 0 and RMem( a + 0x6C ) != 0 then
            set base = RMem( base + 0x30 )
            if base > 0 then
                if base == 'ANcl' then
                    return RMem( a + 0x124 )
                else
                    return GetAbilityOrderID( a )
                endif
            endif
        endif
        return 0
    endfunction

    function ShowAbilityById_Main takes integer ConvertedHandle, integer d returns nothing
        if ConvertedHandle > 0 and RMem( ConvertedHandle ) > 0 then
            call WMem( ConvertedHandle + 0x40, RMem( ConvertedHandle + 0x40 ) + d )
        endif
    endfunction

    function StartAbilityCooldown takes unit whichUnit, integer abilityId, real cd returns boolean
        local integer pAbility = 0
        if GetUnitAbilityLevel( whichUnit, abilityId ) == 0 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 )
                if not InGame then
                    call BJDebugMsg( "Start Cooldown WARNING!" )
                    call BJDebugMsg( "ADRESS-VAL1-VAL2" )
                    call BJDebugMsg( Int2Hex(pAbility)+" - "+Int2Hex(RMem( pAbility + 0x134 ))+" - "+Int2Hex(RMem( pAbility + 0x134 )))
                    call BJDebugMsg( "abil-"+Id2String(abilityId) +" owner-"+ Int2Hex(pAbility)  )
                endif
            endif
            set Memory[pReserverdIntArg1 / 4] = mR2I( cd )
            call CallThisCallWith2Args( pStartAbilityCD, pAbility, pReserverdIntArg1 )
            return IsAbilityOnCooldown( pAbility )
        endif
        return false
    endfunction
    
    function DisableUnitAbilityById takes unit whichUnit, integer id, boolean flag returns boolean
        local integer pAbility = 0
        local integer pDisableCount = 0
    
        if whichUnit == null or id == 0 or GetUnitAbilityLevel( whichUnit, id ) < 1 then
            return false
        endif
    
        set pAbility = GetUnitAbilityForAddresss( ConvertHandle( whichUnit ), id )
        
        set pDisableCount = RMem( pAbility + 0x3C )
        
        if pDisableCount < 0 then 
            call BJDebugMsg( DEBUG + " счетчик безмолвия не верен - " + Int2Hex( pAbility ) + " = " + I2S( pDisableCount ) )
            call BJDebugMsg( INFO )
        endif
        
        if flag then
            call SetAbilityDisabled( pAbility, pDisableCount + 1 )
        else
            call SetAbilityDisabled( pAbility, IMaxBJ( pDisableCount - 1, 0 ) )
        endif
        
        return true
    endfunction
    
    function HideAbilityButton takes unit u, integer id, boolean hide returns nothing
        local integer offset
        if u != null and id != 0 then
            set offset = GetUnitAbility( u, id )
            if offset != 0 then
                if hide then
                    call ShowAbilityById_Main( offset, 1 )
                else
                    call ShowAbilityById_Main( offset, -1 )
                endif
            endif
        endif
    endfunction
   
    function GetAbilityUIDefById takes integer id returns integer
        local integer a = CallThisCallWith1Args( pGetAbilityUIDefAlt, id )
        if a > 0 then
            return a + 4
        endif
        return a
    endfunction
    
    
    function GetAbilityUIDefCaching takes integer id returns integer
        local integer a
        if HaveSavedInteger( ObjectDataPointersTable, DEF_ADR_ABILITY_UI, id ) then
            return LoadInteger( ObjectDataPointersTable, DEF_ADR_ABILITY_UI, id )
        endif
        set a = GetAbilityUIDefById( id )
        if a > 0 then
            call SaveInteger( ObjectDataPointersTable, DEF_ADR_ABILITY_UI, id, a )
        endif
        return a
    endfunction

    function GetAbilityStringParam takes integer id, integer off returns string
        local integer k = GetAbilityUIDefCaching( id )
        if k < 1 then
            return ""
        endif
//	call echo(Int2Hex(k))
        set k = k + off
        if RMem( k ) > 0 then
            return ConvertNullTerminatedStringToString( RMem( k ) )
        endif
        return ""
    endfunction

    function SetAbilityStringParam takes integer id, integer off, string newVal returns boolean
        local integer k = GetAbilityUIDefCaching( id )
        if k < 1 then
            return false
        endif
        call WMem( k + off, GetStringAddress( newVal ) )
        return true
    endfunction

    function GetAbilityStringParam2 takes integer id, integer off, integer lvl returns string
        local integer k = GetAbilityUIDefCaching( id )
        if k < 1 then
            return null
        endif
        set k = k + off
        set lvl = lvl - 1
        if RMem( k ) + lvl * 4 > 0 then
            return ConvertNullTerminatedStringToString( RMem( RMem( k ) + lvl * 4 ) )
        endif
        return null
    endfunction

    function SetAbilityStringParam2 takes integer id, integer off, string newVal, integer lvl returns boolean
        local integer k = GetAbilityUIDefCaching( id )
        if k < 1 then
            return false
        endif
        set k = k + off
        if RMem( k ) > 0 then
            call WMem( RMem( k + lvl * 4 - 4 ), GetStringAddress( newVal ) )
            return true
        endif
        return false
    endfunction
    
    function SetAbilityUbertip takes integer id, integer lvl, string s returns boolean
        return SetAbilityStringParam2( id, 0x158, s, lvl )
    endfunction

    function GetAbilityUbertip takes integer id, integer lvl returns string
        return GetAbilityStringParam2( id, 0x158, lvl )
    endfunction

    function ChangeItemId takes item it, integer targetID returns nothing
        local integer cid = ConvertHandle( it )
        local integer curID
        if cid < 1 then
            return
        endif
        set curID = RMem( cid + 0x30 )
        call WMem( cid + 0x30, targetID )
    endfunction

    function Player2Flag takes player p returns integer
        return R2I( Pow( 2, GetPlayerId( p ) ) )
    endfunction

    function GetUnitVisibilityClass takes unit u returns integer
        local integer a = ConvertHandle( u )
        local integer res = 0
        if a > 0 then
            set res = RMem( a + 0x130 )
            if res > 0 then
                set res = GetSomeAddressForAbility( res, RMem( a + 0x134 ) )
            endif
        endif
        return res
    endfunction

    function GetUnitDetectedClass takes unit u returns integer
        local integer a = ConvertHandle( u )
        local integer res = 0
        if a > 0 then
            set res = RMem( a + 0x13C )
            if res > 0 then
                set res = GetSomeAddressForAbility( res, RMem( a + 0x140 ) )
            endif
        endif
        return res
    endfunction

    function SetEffectSize takes effect e, real size returns nothing
        set Memory[Memory[ConvertHandle( e ) / 4 + 0x28 / 4] / 4 + 0xE8 / 4] = cleanInt( realToIndex( size ) )
    endfunction

    function AddAlwaysVisibleFlag takes unit u, boolean flag returns nothing
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 1 then
            if flag and IsFlagBitSet( RMem( LastConvertedHandle + 0x20 ), 0x10 ) == false then
                call WMem( LastConvertedHandle + 0x20, RMem( LastConvertedHandle + 0x20 ) + 0x10 )
            elseif IsFlagBitSet( RMem( LastConvertedHandle + 0x20 ), 0x10 ) then
                call WMem( LastConvertedHandle + 0x20, RMem( LastConvertedHandle + 0x20 ) - 0x10 )
            endif
        endif
    endfunction

    function GetBuffLevel takes integer pBuff returns integer
        if pBuff < 1 then
            return 0
        endif
        return Memory[( pBuff + 0xb0 ) / 4] + 1
    endfunction

    function SetBuffLevel takes integer pBuff, integer level returns nothing
        if pBuff < 1 or level < 1 then
            return
        endif
        set Memory[( pBuff + 0xb0 ) / 4] = level - 1
    endfunction

    function SetUnitGreenBonusDamage takes unit u, integer i returns nothing
        set Memory[GetUnitAttackAbility( u ) / 4 + 0xAC / 4] = i
    endfunction

    function GetUnitGreenBonusDamage takes unit u returns integer
        return Memory[GetUnitAttackAbility( u ) / 4 + 0xAC / 4]
    endfunction

    function AddUnitGreenBonusDamage takes unit u, integer i returns nothing
        call SetUnitGreenBonusDamage( u, GetUnitGreenBonusDamage( u ) + i )
    endfunction
//! nocjass
    function GetUnitBaseDamage takes unit u returns integer
        return Memory[GetUnitAttackAbility( u ) / 4 + 0xA0 / 4]
    endfunction
//! endnocjass

    function RefreshUnitsCommandPanel takes unit u returns nothing
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            call CallThisCallWith2Args( pRefreshUnitsCommandPanel, LastConvertedHandle, 852290 )
        endif
    endfunction

    function AddAbilityCharges takes unit u, integer id, integer c returns nothing
        local integer a = GetUnitAbility( u, id )
        if a > 0 then
            call WMem( a + 0x124, RMem( a + 0x124 ) + c )
        endif
        call RefreshUnitsCommandPanel( u )//else changes will be visible only at next redraw
    endfunction

    function IsUnitDetectedByPlayer takes unit u, player p returns boolean
	//shared vision-like effect, used for Faerie fire / Wand of evil eye
	//have no reveal effect by itself, used only as detector?
        local integer a = GetUnitDetectedClass( u )
        if a > 0 then
            return IsFlagBitSet( RMem( a + 0x24 ), Player2Flag( p ) )
        endif
        return false
    endfunction

    function RemoveAnyDetectionFromUnit takes unit u returns nothing
        local integer a = ConvertHandle( u )
        if a > 0 then
            call WMem( a + 0x148, 0 )
            call WMem( a + 0x14C, 0 )
            set a = GetUnitVisibilityClass( u )
            if a > 0 then
                call WMem( a + 0x24, 0 )
            endif
        endif
    endfunction

   
    function RecountAnyDetectionForUnit takes unit u returns nothing
        local integer a = ConvertHandle( u )
        local integer sum = 0
        local integer i = 0
        if a > 0 then
            set a = GetUnitDetectedClass( u )
            if a > 0 then
                loop
                    if RMem( a + 0x2C + 4 * i ) > 0 then
                        set sum = sum + R2I( Pow( 2, i ) )
                    endif
                    set i = i + 1
                    exitwhen i > 15
                endloop
                call WMem( a + 0x14C, sum )
                call WMem( a + 0x148, sum )
                set sum = 0
                set i = 0
            endif
            set a = GetUnitVisibilityClass( u )
            if a > 0 then
                loop
                    if RMem( a + 0x2C + 4 * i ) > 0 then
                        set sum = sum + R2I( Pow( 2, i ) )
                    endif
                    set i = i + 1
                    exitwhen i > 15
                endloop
                call WMem( a + 0x24, sum )
            endif
        endif
    endfunction

    function GetHeroAbilityFromList takes unit uHero, integer list returns integer
        set LastConvertedHandle = ConvertHandle( uHero )
    
        if IsUnitType( uHero, UNIT_TYPE_HERO ) and LastConvertedHandle > 1 and list > 0 then
            return RMem( RMem( LastConvertedHandle + 496 ) + 240 + 4 * list )
        endif

        return 0
    endfunction

    function IsUnitAbilityDisabled takes unit whichUnit, integer id returns boolean
        if whichUnit == null or id == 0 or GetUnitAbilityLevel( whichUnit, id ) < 1 then
            return false
        endif
    
        set LastConvertedHandle = GetUnitAbilityForAddresss( ConvertHandle( whichUnit ), id )
        
        if LastConvertedHandle < 1 then
            return false
        endif
        
        return GetAbilityDisabledCount( LastConvertedHandle ) > 0
    endfunction
    
    function ThrowTargetSpellTargetUnit takes unit who, integer id, widget target returns nothing
        local integer a = ConvertHandle( target )
        local integer x
        local integer y
        local integer flags
        if a > 0 and GetHandleId( who ) > 0 then
            set x = RMem( a + 0xC )
            set y = RMem( a + 0x10 )
            if x > 0 and y > 0 then
                set a = ConvertHandle( who )
                if a < 1 then
                    return
                endif
                set a = GetUnitAbility( who, id )
                if a > 0 then
                    call WMem( a + 0xE4, x )//for any target ( widget )
                    call WMem( a + 0xE8, y )
                    set flags = RMem( a + 0x20 )
                    if not IsFlagBitSet( flags, 0x10000 ) then
					//0x19804 stands for "target", 0x1F020 stands for "target item",0x9800 stands for point target
                        call WMem( a + 0x20, flags + 0x10000 )
                        set flags = flags + 0x10000
                        if not IsFlagBitSet( flags, 0x1 ) then
                            call WMem( a + 0x20, flags + 0x1 )
                        endif
                    endif
                    set a = CallThisCallWith1Args( pCastAbility, a )
                endif
            endif
        endif
    endfunction
    
    function IsCooldownUIHided takes integer pAbility returns boolean

        if pAbility < 1 then
            return false
        endif

        return IsFlagBitSet( RMem( pAbility + 0x20 ), 0x400 )
    endfunction

    function HideCooldownUIById takes unit whichUnit, integer id, boolean hide returns nothing
        local integer pAbility = GetUnitAbilityForAddresss( ConvertHandle( whichUnit ), id )
   
        if pAbility < 1 then
            return
        endif
    
        set pAbility = pAbility + 0x20
    
       if hide and not IsFlagBitSet( RMem( pAbility ), 0x400 ) then
            call WMem( pAbility, RMem( pAbility ) + 0x400 )
        elseif not hide and IsFlagBitSet( RMem( pAbility ), 0x400 ) then
            call WMem( pAbility, RMem( pAbility ) - 0x400 )
        endif

    endfunction
    
    function AllocateExecutableMemory takes integer size returns integer
        local integer retval = 0
        if pVirtualAlloc != 0 then
            if pMergeUnitsOffset == 0 then
                set pMergeUnitsOffset = CreateJassNativeHook( pMergeUnits, RMem( pVirtualAlloc ) )
            else
                call WMem( pMergeUnitsOffset, RMem( pVirtualAlloc ) )
            endif
            set retval = B2I( MergeUnits( 0, size + 4, 0x3000, 0x40 ) )
            call WMem( pMergeUnitsOffset, pMergeUnits )
        endif
	
        if retval == 0 then
            return 0
        endif
	
        return ( retval + 4 ) / 4 * 4
    endfunction
    
    function ReadSomeRegisterOffset takes integer register, integer offset returns integer
        local integer retval = 0
        call WMem( pReadStack, 0xCCC3008B + register )
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pReadStack )
        else
            call WMem( pIgnoredUnitsOffset, pReadStack )
        endif
	
        set retval = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        if offset == 0 then
            return retval
        endif
        return RMem( retval + offset )
    endfunction

    function FlushInstructionCache takes integer a, integer size returns nothing
        if pFlushInstructionCache == 0 then
            set pFlushInstructionCache = GetModuleProcAddress( EXTRADLLNAME, "_FlushInstructionCache" )
        endif
        if pFlushInstructionCache != 0 then
            call CallStdcallWith2Args( pFlushInstructionCache, a, size )
        endif
    endfunction

// Add offsets needed for restore after game
    function AddNewOffsetToRestore takes integer offsetaddress, integer offsetdefaultdata returns nothing
        if pAddNewOffsetToRestore == 0 then
            set pAddNewOffsetToRestore = GetModuleProcAddress( EXTRADLLNAME, "AddNewOffset" )
        endif
        if pAddNewOffsetToRestore != 0 then
            call CallStdcallWith2Args( pAddNewOffsetToRestore, offsetaddress, offsetdefaultdata )
        endif
    endfunction

    function ChangeOffsetProtection takes integer pRealOffset, integer memSize, integer pProtectFlag returns integer
        local integer a
        local integer nIndex = 0
	
        if pVirtualProtect == 0 then
            set pVirtualProtect = GetModuleProcAddress( "Kernel32.dll", "VirtualProtect" )
        endif
        if pVirtualProtect != 0 then
            call AddNewOffsetToRestore( pRealOffset, RMem( pRealOffset ) )
            if memSize > 4 then
                set nIndex = memSize / 4 - 1
                set a = pRealOffset
                loop
                    exitwhen nIndex < 1
                    set a = a + 4
                    call AddNewOffsetToRestore( a, RMem( a ) )
                    set nIndex = nIndex - 1
                endloop
            endif
            call CallStdcallWith4Args( pVirtualProtect, pRealOffset, memSize, pProtectFlag, pReserverdIntArg1 )
            call FlushInstructionCache( pRealOffset, memSize )
            return RMem( pReserverdIntArg1 )
        endif

        return 0
    endfunction

    function ReadEAX takes nothing returns integer
        return ReadSomeRegisterOffset( REGISTER_EAX, 0 )
    endfunction

    function ReadEBX takes nothing returns integer
        return ReadSomeRegisterOffset( REGISTER_EBX, 0 )
    endfunction

    function ReadECX takes nothing returns integer
        return ReadSomeRegisterOffset( REGISTER_ECX, 0 )
    endfunction

    function ReadEDX takes nothing returns integer
        return ReadSomeRegisterOffset( REGISTER_EDX, 0 )
    endfunction

    function ReadESI takes nothing returns integer
        return ReadSomeRegisterOffset( REGISTER_ESI, 0 )
    endfunction

    function ReadEDI takes nothing returns integer
        return ReadSomeRegisterOffset( REGISTER_EDI, 0 )
    endfunction

    function ReadEBP takes nothing returns integer
        return ReadSomeRegisterOffset( REGISTER_EBP, 0 )
    endfunction

    function ReadESP takes nothing returns integer
        return ReadSomeRegisterOffset( REGISTER_ESP, 0 )
    endfunction

    function ReadEAX_offset takes integer offset returns integer
        return ReadSomeRegisterOffset( REGISTER_EAX, offset )
    endfunction

    function ReadEBX_offset takes integer offset returns integer
        return ReadSomeRegisterOffset( REGISTER_EBX, offset )
    endfunction

    function ReadECX_offset takes integer offset returns integer
        return ReadSomeRegisterOffset( REGISTER_ECX, offset )
    endfunction

    function ReadEDX_offset takes integer offset returns integer
        return ReadSomeRegisterOffset( REGISTER_EDX, offset )
    endfunction

    function ReadESI_offset takes integer offset returns integer
        return ReadSomeRegisterOffset( REGISTER_ESI, offset )
    endfunction

    function ReadEDI_offset takes integer offset returns integer
        return ReadSomeRegisterOffset( REGISTER_EDI, offset )
    endfunction

    function ReadEBP_offset takes integer offset returns integer
        return ReadSomeRegisterOffset( REGISTER_EBP, offset )
    endfunction

    function ReadESP_offset takes integer offset returns integer
        return ReadSomeRegisterOffset( REGISTER_ESP, offset )
    endfunction
    
    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
        local integer offset = RMem( RMem( pDamageEspData ) + 0x8 )
        local integer IsMelee = 0x100
        local integer d
  
  
        if DamageIncrementer > 8000 then
            set DamageIncrementer = 10
        endif
        //call TestMissileHandlerWorker( )

        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( I2S( DamageAttackTypes[DamageIncrementer] ) + " - тип аттаки" )
    
        set d = DamageDamageTypes[DamageIncrementer]
    
        call BJDebugMsg( I2S( d ) + " - тип урона" )
    
    
    
  //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
// 
        set IsMelee = RMem( RMem( RMem( pDamageEspData ) + 0x8 ) + 0xC )
        if IsMelee == 0x100 then
            call BJDebugMsg( "is melle = true" )
        endif
    
        if IsMelee == 0x101 then
            call BJDebugMsg( "is ranged = true" )
        endif
    
        if IsMelee != 0x100 and IsMelee != 0x101 then
            call BJDebugMsg( "is melle = false and is ranged false" )
        endif
    
  //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
 
  
    
endlibrary
Вот самый минимум функций, ну кое какие мои функций.
`
ОЖИДАНИЕ РЕКЛАМЫ...
22
Зайди Utils удали там все кроме AllocateExecutableMemory а потом береш какие функции надо и родителя функции для впомогательных...
32
pro100master, в мемхаке где детект урона, вырезано практически все кроме нужного, могу скинуть свой мх.
21
quq_CCCP, да было бы неплохо. Там где детект урона, как раз таки написано: "Здесь находится куча мусора, относящееся только к доте, вырезайте всё, что вам не нужно." Если, , конечно, мы говорим об одной карте.
32
Utils
library Utils uses Typecast, Memory, Bitwise, StringId, ObjectData


    function ConvertHandle takes handle h returns integer
        if GetHandleId( h ) > 0 then
            return RMem( RMem( RMem( RMem( GameState ) + 28 ) + 412 ) + GetHandleId( h ) * 12 - 0x2FFFFF * 4 )
        endif
        return 0
    endfunction

    function ConvertPointer takes integer ptr returns integer
        local integer i = RMem( ptr )
        if i < 0 then
            return RMem( RMem( pointers + 44 ) - i * 8 + 4 ) //checkme
        endif
        return RMem( RMem( pointers + 12 ) + i * 8 + 4 )
    endfunction

    function IsFlagBitSet takes integer flags, integer bit returns boolean
        if bit != 0 then
            return flags / bit * 0x80000000 != 0
        endif
        return false
    endfunction
    
    function GetUnitFlags0x5C takes unit u returns integer
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            return RMem( LastConvertedHandle + 0x5C )
        endif
        return 0
    endfunction

    function SetUnitFlags0x5C takes unit u, integer i returns nothing
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            call WMem( LastConvertedHandle + 0x5C, i )
        endif
    endfunction

    function AddUnitFlags0x5C takes unit u, integer i returns nothing
        local integer f
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            set f = RMem( LastConvertedHandle + 0x5C )
            if i > 0 then
                if not IsFlagBitSet( f, i ) then
                    call WMem( LastConvertedHandle + 0x5C, f + i )
                endif
            else
                if IsFlagBitSet( f, -i ) then
                    call WMem( LastConvertedHandle + 0x5C, f + i )
                endif
            endif
        endif
    endfunction

//armor types:
// 0 - Light; 1 - Medium; 2 - Heavy; 3 - Fortified; 4 - Normal; 5 - Hero; 6 - Divine; 7 - unarmored; 
//rest seems to have Light properties
    function GetUnitArmorType takes unit u returns integer
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            return RMem( LastConvertedHandle + 0xE4 )
        endif
        return 0
    endfunction

    function SetUnitArmorType takes unit u, integer id returns nothing
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            call WMem( LastConvertedHandle + 0xE4, id )
        endif
    endfunction

    function GetUnitArmor takes unit u returns real
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            return mI2R( RMem( LastConvertedHandle + 0xE0 ) )
        endif
        return 0.
    endfunction

    function SetUnitArmor takes unit u, real r returns nothing
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            call WMem( LastConvertedHandle + 0xE0, mR2I( r ) )
        endif
    endfunction

    function SetUnitTypeId takes unit u, integer i returns nothing
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            call WMem( LastConvertedHandle + 0x30, i )
        endif
    endfunction

    function GetUnitTypeIdReal takes integer i returns integer
        return RMem( i + 0x30 )
    endfunction

    function GetUnitTypeId2 takes unit u returns integer
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            return GetUnitTypeIdReal( LastConvertedHandle )
        endif
        return 0
    endfunction

    function SetUnitPhased takes unit u returns nothing
        local integer data = GetObjectDataCaching( pUnitData , GetUnitTypeId( u ) ) + 0x1AC
        local integer p1 = RMem( data )
        local integer p2 = RMem( data + 4 )
//	call BJDebugMsg(Int2Hex((data-107)*4))
        call WMem( data, 8 )
        call WMem( data + 4, 16 )
        call SetUnitPathing( u, true )
        call WMem( data, p1 )
        call WMem( data + 4, p2 )
    endfunction

    function GetUnitFlags0x20 takes unit u returns integer
        local integer a = ConvertHandle( u )
        if a > 0 then
            return RMem( a + 0x20 )
        endif
        return 0
    endfunction

    function SetUnitFlags0x20 takes unit u, integer i returns nothing
        local integer a = ConvertHandle( u )
        if a > 0 then
            call WMem( a + 0x20, i )
        endif
    endfunction

    function AddUnitFlags0x20 takes unit u, integer flag returns nothing
        local integer a = ConvertHandle( u )
        local integer f
        if a > 0 then
            set f = RMem( a + 0x20 )
            if IsFlagBitSet( f, flag ) then
                return
            endif
            call WMem( a + 0x20, f + flag )
        endif
    endfunction

    function ModifyUnitFlags0x20 takes unit u, integer flag returns nothing
        local integer a = ConvertHandle( u )
        local integer f
        if a > 0 then
            set f = RMem( a + 0x20 )
            if flag > 0 then
                if IsFlagBitSet( f, flag ) then
                    return
                endif
                call WMem( a + 0x20, f + flag )
            else
                if IsFlagBitSet( f, -flag ) then
                    call WMem( a + 0x20, f + flag )
                endif
            endif
        endif
    endfunction

// Real - addres in memory

    function GetRealPlayerById takes integer i returns integer
        local integer pladdr = RMem( pGlobalPlayerClass )
        if pladdr > 0 then
            return RMem( pladdr + ( i * 4 ) + 0x58 )
        endif
        return 0
    endfunction

    function GetLocalPlayerIdReal takes nothing returns integer
        local integer pladdr = RMem( pGlobalPlayerClass )
        if pladdr > 0 then
            return RMem( pladdr + 0xA )
        endif
        return - 1
    endfunction

    function GetLocalPlayerReal takes nothing returns integer
        return GetRealPlayerById( GetLocalPlayerIdReal( ) )
    endfunction

// Get Selected Unit
    function GetPlayerSelectedUnitReal takes integer realplayer returns integer
        local integer pladdr = realplayer + 0x34
        set pladdr = RMem( pladdr )
        if pladdr > 0 then
            return RMem( pladdr + 0x1E0 )
        endif
        return - 1
    endfunction
    
    function SetPlayerSelectedUnitReal takes integer realplayer, integer pConvertedHandle returns nothing
        local integer pladdr = realplayer + 0x34
        set pladdr = RMem( pladdr )
        if pladdr > 0 then
            call WMem( pladdr + 0x1E0, pConvertedHandle )
        endif
    endfunction
    
    function GetJassContext takes integer id returns integer
        return ReadUnrealMemory( ReadUnrealMemory( ReadUnrealMemory( RMem( pJassEnvAddress ) / 4 + 5 ) / 4 + 36 ) / 4 + id )
    endfunction

    function GetStringAddress takes string s returns integer
        if s == EXTRADLLNAME then
            if ExtraDLLStringAddress == 0 then
                set ExtraDLLStringAddress = ReadUnrealMemory( ReadUnrealMemory( ReadUnrealMemory( ReadUnrealMemory( GetJassContext( 1 ) / 4 + 2589 ) / 4 + 2 ) / 4 + SH2I( EXTRADLLNAME ) * 4 + 2 ) / 4 + 7 )
            endif
            return ExtraDLLStringAddress
        endif
        return ReadUnrealMemory( ReadUnrealMemory( ReadUnrealMemory( ReadUnrealMemory( GetJassContext( 1 ) / 4 + 2589 ) / 4 + 2 ) / 4 + SH2I( s ) * 4 + 2 ) / 4 + 7 )
    endfunction

    function WriteNullTerminatedString takes string s, integer a returns nothing
        call WMem( a, GetStringAddress( s ) )
    endfunction

    function GetDefAddr takes integer id, integer class, integer first, integer currentOffset returns integer
        local integer FirstDataDefEntry
        local integer CurrentDefAddr = 0
        local integer FirstDefAddr
        local integer CurrentDefId = 0
        if first < 1 then
            //set tt_str1 = "Not found DefAddr 0 id=" + I2S( id ) + " class=" + I2S( class )
            call ExecuteFunc( "JassLogWrapper" )
            return 0
        endif
        set FirstDataDefEntry = RMem( first )
        if FirstDataDefEntry > 0 then
            set CurrentDefAddr = RMem( FirstDataDefEntry + 8 )
        endif
        set CurrentDefAddr = CurrentDefAddr + currentOffset
        set FirstDefAddr = CurrentDefAddr
        if FirstDataDefEntry < currentOffset then
            //set tt_str1 = "Not found DefAddr 1 id=" + I2S( id ) + " class=" + I2S( class )
            call ExecuteFunc( "JassLogWrapper" )
            return 0
        endif
        loop
            set CurrentDefId = RMem( CurrentDefAddr + 8 )
//		call echo("CurDefVal: "+Int2Hex(CurrentDefId) +" "+ Int2Hex(CurrentDefAddr))
            if HaveSavedInteger( ObjectDataPointersTable, class, CurrentDefId ) == false and CurrentDefAddr > 0xC then
                call SaveInteger( ObjectDataPointersTable, class, CurrentDefId, CurrentDefAddr - 0xC )
            endif
            exitwhen CurrentDefId == id or CurrentDefAddr < 1
            set CurrentDefAddr = RMem( CurrentDefAddr )
            if CurrentDefAddr < 1 or CurrentDefAddr == FirstDefAddr then
                //set tt_str1 = "Not found DefAddr 2 id=" + I2S( id ) + " class=" + I2S( class )
                call ExecuteFunc( "JassLogWrapper" )
                return 0
            endif
        endloop
        if CurrentDefAddr < 0xD then
            //set tt_str1 = "Not found DefAddr 3 id=" + I2S( id ) + " class=" + I2S( class ) + " curDef=" + I2S( CurrentDefAddr )
            call ExecuteFunc( "JassLogWrapper" )
            return 0
        endif
        set CurrentDefAddr = CurrentDefAddr - 0xC
        if CurrentDefAddr == Actual0xAB5948ForVersion then
            return 0
        endif
        return CurrentDefAddr// as GetObjectData * 4 but search only by id..
    endfunction

    function GetDefAddrCaching takes integer id, integer class, integer first, integer currentOffset returns integer
        if HaveSavedInteger( ObjectDataPointersTable, class, id ) then
//		call echo("loaded")
            return LoadInteger( ObjectDataPointersTable, class, id )
        endif
        return GetDefAddr( id, class, first, currentOffset )
    endfunction

    

//1 = str, 2 = int, 3 = agi
    function GetHeroPrimaryAttribute takes unit u returns integer
        local integer a = ConvertHandle( u )
        if a > 0 then
            set a = RMem( a + 0x1F0 )
            if a > 0 then
                return RMem( a + 0xCC )
            endif
        endif
        return 0
    endfunction

    function SetHeroPrimaryAttribute takes unit u, integer i returns nothing
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            if IsHeroUnitId( GetUnitTypeId( u ) ) then
                set LastConvertedHandle = RMem( LastConvertedHandle + 0x1F0 )
                if LastConvertedHandle > 0 then
                    call WMem( LastConvertedHandle + 0xCC, i )
                endif
            endif
        endif
    endfunction

    function SetAbilityManaCost takes integer abil, integer level, integer cost returns nothing
        local integer a = GetObjectDataCaching( pAbilityData, abil )
        if a > 0 then
            set a = RMem( a + 0x54 )
            if a > 0 then
                call WMem( a - 0x58 + level * 0x68, cost )
            endif
        endif
    endfunction

    function GetAbilityManaCost takes integer abil, integer level returns integer
        local integer a = GetObjectDataCaching( pAbilityData, abil )
        if a > 0 then
            set a = RMem( a + 0x54 )
            if a > 0 then
                return RMem( a - 0x58 + level * 0x68 )
            endif
        endif
        return 0
    endfunction

    function GetAbilityManaCostAddr takes integer add, integer level returns integer
        local integer a = RMem( add + 0x54 )
        if a > 0 then
            return RMem( a + level * 0x68 )
        endif
        return 0
    endfunction

    function SetAbilityManaCostAddr takes integer add, integer level, integer mc returns nothing
        local integer a = RMem( add + 0x54 )
        if a > 0 then
            call WMem( a + level * 0x68, mc )
        endif
    endfunction

    function SetAbilityCD takes integer abil, integer level, real cool returns nothing
        local integer a = GetObjectDataCaching( pAbilityData, abil )
        if a > 0 then
            set a = RMem( a + 0x54 )
            if a > 0 then
                call WMem( a - 0x54 + level * 0x68, mR2I( cool ) )
            endif
        endif
    endfunction

    function GetAbilityCD takes integer abil, integer level returns real
        local integer a = GetObjectDataCaching( pAbilityData, abil )
        if abil == 'A1P8'then//DotA - specific, charge of darkness
            return 12.
        endif
        if a > 0 then
            set a = RMem( a + 0x54 )
            if a > 0 then
                return mI2R( RMem( a - 0x54 + level * 0x68 ) )
            endif
        endif
        return 0.
    endfunction

    function GetAbilityMaxLevel takes integer abil returns integer
        local integer a
        if abil == 0 then
            return 0
        endif
        set a = GetObjectDataCaching( pAbilityData, abil )
        if a > 0 then
            return RMem( a + 0x50 )
        endif
        return 0
    endfunction

    function AddAbilityCooldownConverted takes integer a, real seconds returns nothing
        local integer pData = RMem( a + 0xDC )
        if pData > 0 then
            call WMem( pData + 4, mR2I( seconds + mI2R( RMem( pData + 4 ) ) ) )
        endif
    endfunction

    function GetAbilityCurrentCooldownConverted takes integer a returns real
        local integer pData = RMem( a + 0xDC )
        if pData > 0 then
            return mI2R( RMem( pData + 4 ) ) - mI2R( RMem( RMem( pData + 0xC ) + 0x40 ) )
        endif
        return .0
    endfunction

//function GetRealGameTime takes nothing returns integer 
//desync-able, do not use
//returns ms value (1s = 1000 here)
//	return RMem(pGameTime)
//endfunction

    function IsAbilityOnCooldown takes integer a returns boolean
        return IsFlagBitSet( RMem( a + 0x20 ), 512 )
    endfunction

    function SetAbilityDisabled takes integer pAbility, integer count returns nothing
        if pAbility > 0 then
            call WMem( pAbility + 0x3C, count )
        endif
	//not safe unless used with PauseUnit. Button will be blacked, but current casts of that ability won’t be interrupted.
    endfunction

    function GetAbilityDisabledCount takes integer pAbility returns integer
        if pAbility > 0 then
            return RMem( pAbility + 0x3C )
        endif
        return 0
    endfunction

    function SetAbilityHidden takes integer pAbility, integer count returns nothing
        call WMem( pAbility + 0x40, count )
	//This one is 100% safe. This hides the ability button, and order can’t be issued.
    endfunction

    function AddAbilityHidden takes integer a, integer d returns nothing
        call WMem( a + 0x40, RMem( a + 0x40 ) + d )
    endfunction

    function SetAbilityDisabled2 takes integer pAbility, integer count returns nothing
        call WMem( pAbility + 0x44, count )
	//This one is used by Orb of Slow or Windwalk. Button is blacked, but cooldown is stil displayed.
    endfunction

    function GetAbilityDisabled2 takes integer pAbility returns integer
        return RMem( pAbility + 0x44 )
    endfunction

    function DisableUnitsMovement takes unit u, boolean disable returns nothing
        local integer i = 2
        local integer a = GetHandleId( u )
        if a < 1 then
            return
        endif
        if disable == false then
            set i = 1
        endif
        call PauseUnit( u, true )
        set a = ConvertHandle( u )
        if a > 0 then
            set a = RMem( a + 0x1EC )
            if a > 0 then
                call SetAbilityDisabled( a, i )
            endif
        endif
        call PauseUnit( u, false )
    endfunction
//pointer to 'Amov' is located at offset 123 of unit object, Aatk is at offset 122, and AInv is offset 124

//Hides all command buttons and sets the Ward flag. Unit will keep its current order, and player can’t give new orders
//Notice the the unit can’t be ordered with triggers as well. To issue an order you need to temporarily reenable control
    function DisableUnitControl takes unit u returns nothing
        local integer pUnit = ConvertHandle( u )
        local integer flags
        local integer Amov
        local integer Aatk
        local integer AInv
        if pUnit > 0 then
            set flags = RMem( pUnit + 0x248 )
            set Amov = RMem( pUnit + 0x1EC )
            set Aatk = RMem( pUnit + 0x1E8 )
            set AInv = RMem( pUnit + 0x1F8 )
	//	call echo("disabled on "+GetUnitName(u))
            if not IsFlagBitSet( flags, 512 ) then
                call WMem( pUnit + 0x248, flags + 512 )
            endif
            if Amov > 0 then
                call WMem( Amov + 0x40, RMem( Amov + 0x40 ) + 1 )
            endif
            if Aatk > 0 then
                call WMem( Aatk + 0x40, RMem( Aatk + 0x40 ) + 1 )
            endif
            if AInv > 0 then
                call WMem( AInv + 0x3C, RMem( AInv + 0x3C ) + 1 )
            endif
		
        endif
    endfunction

//Removes the Ward flag and reenables Amov and Aatk
    function EnableUnitControl takes unit u returns nothing
        local integer pUnit = ConvertHandle( u )
        local integer flags
        local integer Amov
        local integer Aatk
        local integer AInv
        if pUnit > 0 then
            set flags = RMem( pUnit + 0x248 )
            set Amov = RMem( pUnit + 0x1EC )
            set Aatk = RMem( pUnit + 0x1E8 )
            set AInv = RMem( pUnit + 0x1F8 )
	//	call echo("disabled on "+GetUnitName(u))
            if IsFlagBitSet( flags, 512 ) then
                call WMem( pUnit + 0x248, flags - 512 )
            endif
            if Amov > 0 then
                call WMem( Amov + 0x40, RMem( Amov + 0x40 ) - 1 )
            endif
            if Aatk > 0 then
                call WMem( Aatk + 0x40, RMem( Aatk + 0x40 ) - 1 )
            endif
            if AInv > 0 then
                call WMem( AInv + 0x3C, RMem( AInv + 0x3C ) - 1 )
            endif
        endif
    endfunction

    function SetUnitPortrait takes integer uiobjectaddr, string s returns nothing
        call WriteNullTerminatedString( s, uiobjectaddr + 0x34 )
    endfunction

    function SetUnitModel takes integer uiobjectaddr, string s returns nothing
        call WriteNullTerminatedString( s, uiobjectaddr + 0x30 )
    endfunction

    function SetUnitModelUFAddress takes integer address, string s returns nothing
        call SetUnitModel( address, s )
    endfunction

    function GetUnitAttackAbilityForAddress takes integer pConvertedHandle returns integer
        return RMem( pConvertedHandle + 0x1E8 )
    endfunction

    function GetUnitAttackAbility takes unit u returns integer
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            return GetUnitAttackAbilityForAddress( LastConvertedHandle )
        endif
        return 0
    endfunction

    function SetUnitAttackAbilityForAddress takes integer pConvertedHandle, integer pAddr returns nothing
        call WMem( pConvertedHandle + 0x1E8, pAddr )
    endfunction

    function SetUnitAttackAbility takes unit u , integer pAddr returns nothing
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            call SetUnitAttackAbilityForAddress( LastConvertedHandle, pAddr )
        endif
    endfunction

    function GetUnitMoveAbilityForAddress takes integer pConvertedHandle returns integer
        return RMem( pConvertedHandle + 0x1EC )
    endfunction

    function GetUnitMoveAbility takes unit u returns integer
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            return GetUnitMoveAbilityForAddress( LastConvertedHandle )
        endif
        return 0
    endfunction

    function SetUnitMoveAbilityForAddress takes integer pConvertedHandle, integer pAddr returns nothing
        call WMem( pConvertedHandle + 0x1EC, pAddr )
    endfunction

    function SetUnitMoveAbility takes unit u, integer pAddr returns nothing
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            call SetUnitMoveAbilityForAddress( LastConvertedHandle, pAddr )
        endif
    endfunction

    function GetUnitHeroAbilityForAddress takes integer pConvertedHandle returns integer
        return RMem( pConvertedHandle + 0x1F0 )
    endfunction

    function GetUnitHeroAbility takes unit u returns integer
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            return GetUnitHeroAbilityForAddress( LastConvertedHandle )
        endif
        return 0
    endfunction

    function GetUnitBuildAbilityForAddress takes integer pConvertedHandle returns integer
        return RMem( pConvertedHandle + 0x1F4 )
    endfunction

    function GetUnitBuildAbility takes unit u returns integer
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            return GetUnitBuildAbilityForAddress( LastConvertedHandle )
        endif
        return 0
    endfunction

    function GetUnitInventoryAbilityForAddress takes integer pConvertedHandle returns integer
        return RMem( pConvertedHandle + 0x1F8 )
    endfunction

    function GetUnitInventoryAbility takes unit u returns integer
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            return GetUnitInventoryAbilityForAddress( LastConvertedHandle )
        endif
        return 0
    endfunction


// Alternative for sub_6F4786B0 (126a)
    function GetSomeAddress takes integer pAddr1 , integer pAddr2 returns integer
//I just split your function into 2, it should be working as before
        local integer pOff1 = 0x2C
        if pAddr1 == -1 and pAddr2 == -1 then
            return 0
        endif
        if pAddr1 >= 0 then
            set pOff1 = 0xC
        endif
        set pOff1 = RMem( pGameClass1 ) + pOff1
        set pOff1 = RMem( pOff1 )
        if pOff1 == 0 then
            return 0
        endif
	
        set pOff1 = RMem( pOff1 + 8 * pAddr1 + 4 )
        if pOff1 == 0 or RMem( pOff1 + 0x18 ) != pAddr2 then
            return 0
        endif
        return pOff1
    endfunction

    function GetSomeAddressForAbility takes integer pAddr1 , integer pAddr2 returns integer //Second part of GetSomeAddressForAbility
        local integer pOff1 = GetSomeAddress( pAddr1, pAddr2 )
        if pOff1 == 0 or RMem( pOff1 + 0x20 ) != 0 then
            return 0
        endif
        return RMem( pOff1 + 0x54 )
    endfunction

    function GetSomeAddressForLocustFlags takes integer pAddr1 , integer pAddr2 returns integer
        local integer i = GetSomeAddress( pAddr1, pAddr2 )
        return RMem( i + 0x94 )
    endfunction

    function SetLocustFlags takes unit u, integer i returns nothing //These flags can make unit immune to truesight
        local integer pOff1
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            set LastConvertedHandle = LastConvertedHandle + 0x16C
            set pOff1 = GetSomeAddressForLocustFlags( RMem( LastConvertedHandle ), RMem( LastConvertedHandle + 4 ) )
            if pOff1 > 0 then
                call WMem( pOff1 + 0x34, i )
            endif
        endif
    endfunction

    function EnableTruesightImmunity takes unit u returns nothing
//I don’t really know what other side effects may be caused by this, at least GroupEnum is not affected
        call SetLocustFlags( u, 0x08000000 )
    endfunction

    function DisableTruesightImmunity takes unit u returns nothing
        call SetLocustFlags( u, 0 )
    endfunction

    function UnStunUnit takes unit u returns nothing
	//unsafe, do not use unless you tested it through
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            call WMem( LastConvertedHandle + 0x198, 0 )
        endif
    endfunction

    function IsUnitStunned2 takes unit u returns boolean
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            return RMem( LastConvertedHandle + 0x198 ) > 0
        endif
        return false
    endfunction

    function IsUnitInvulnerable takes unit u returns boolean // проверяет только флаг неуязвимости
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            return IsFlagBitSet( RMem( LastConvertedHandle + 0x20 ), 8 )
        endif
        return false
    endfunction

    function IsUnitInvulnerable2 takes unit u returns boolean // проверяет только счетчик неуязвимости
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            return RMem( LastConvertedHandle + 0xE8 ) > 0
        endif
        return false
    endfunction

    function GetUnitInvulnerableCounter takes unit u returns integer
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            return RMem( LastConvertedHandle + 0xE8 )
        endif
        return 0
    endfunction

    function SetUnitInvulnerableCounter takes unit u, integer i returns nothing
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            call WMem( LastConvertedHandle + 0xE8, i )
        endif
    endfunction

    function ModifyInvulnerableCounter takes unit u, integer diff returns nothing
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            call WMem( LastConvertedHandle + 0xE8, RMem( LastConvertedHandle + 0xE8 ) + diff )
        endif
    endfunction

    function GetUnitAbilityForAddresss takes integer pConvertedHandle, integer abilid returns integer
        local integer pAddr1 = pConvertedHandle + 0x1DC
        local integer pAddr2 = pConvertedHandle + 0x1E0
        local integer pOff1 = 0
        set pAddr1 = RMem( pAddr1 )
        set pAddr2 = RMem( pAddr2 )
        if pAddr1 == 0 or pAddr2 == 0 or ( pAddr1 == -1 and pAddr2 == -1 ) then
            return 0
        endif
        set pOff1 = GetSomeAddressForAbility( pAddr1, pAddr2 )
        loop
            exitwhen pOff1 <= 0
            if RMem( pOff1 + 0x34 ) == abilid then
                return pOff1
            endif
            set pOff1 = GetSomeAddressForAbility( RMem( pOff1 + 0x24 ), RMem( pOff1 + 0x28 ) )
        endloop
        return pOff1
    endfunction

    function GetAbilityOrderID takes integer pAbility returns integer
        local integer pOffset2
        if pAbility < 1 then
            return 0
        endif
//	call BJDebugMsg(Int2Hex(pAbility)+" sent")
//	call PolledWait(1.)

	//  mov ecx,[esp+04]
	//  mov edx,[ecx+6C]
	//  cmp edx,D0142 { 852290 }
	//  je 0493413A
	//  mov eax,00000000 { 0 }
	//  ret 
	//  mov ecx,[ecx]
	//  mov ecx,[ecx+00000308]
	//  call ecx
	//  ret 
	
        if RMem( pGetAbilityOrderID ) == 0 then
            call WMem( pGetAbilityOrderID, 0x04244C8B )
            call WMem( pGetAbilityOrderID + 4, 0x816C518B )
            call WMem( pGetAbilityOrderID + 8, 0x0D0142FA )
            call WMem( pGetAbilityOrderID + 12, 0xB8067400 )
            call WMem( pGetAbilityOrderID + 16, 0x00000000 )
            call WMem( pGetAbilityOrderID + 20, 0x8B098BC3 )
            call WMem( pGetAbilityOrderID + 24, 0x00030889 )
            call WMem( pGetAbilityOrderID + 28, 0x90E1FF00 )
        endif
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pGetAbilityOrderID )
        else
            call WMem( pIgnoredUnitsOffset, pGetAbilityOrderID )
        endif
	

        if pIgnoredUnitsOffset != 0 then
            set pOffset2 = IgnoredUnits( pAbility )
            call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
            return pOffset2
        endif
	
        return 0
    endfunction

    function PrintAllUnitAbilities takes integer pConvertedHandle returns nothing
        local integer pAddr1 = pConvertedHandle + 476
        local integer pAddr2 = pConvertedHandle + 480

        local integer pOff1 = 0

        set pAddr1 = RMem( pAddr1 )
        set pAddr2 = RMem( pAddr2 )
        if pAddr1 == 0 or pAddr2 == 0 or BitwiseAnd( pAddr1, pAddr2 ) == -1 then
            return
        endif

        set pOff1 = GetSomeAddressForAbility( pAddr1, pAddr2 )
	
        if pOff1 == 0 then
            return
        endif
	
        loop
            exitwhen pOff1 == 0

            call DisplayTimedTextToPlayer( GetLocalPlayer( ), 0.0, 0.0, 40, "Address:" + Int2Hex( pOff1 ) + ". ID:" + Id2String( RMem( pOff1 + 52 ) ) + " name: " + GetObjectName( RMem( pOff1 + 52 ) ) )
		
            set pOff1 = GetSomeAddressForAbility( RMem( pOff1 + 36 ), RMem( pOff1 + 40 ) )
        endloop
	
    endfunction

    function GetAllUnitAbilities takes unit u returns nothing
        local integer pConvertedHandle = ConvertHandle( u )
        local integer pAddr1
        local integer pAddr2
        local integer i = 0
        local integer h = GetHandleId( u )
        local integer pOff1 = 0
        local integer id
        call FlushChildHashtable( gg_htb_HashData, h )
        if pConvertedHandle < 1 then
            return
        endif
        set pAddr1 = pConvertedHandle + 0x1DC
        set pAddr2 = pConvertedHandle + 0x1E0
        set pAddr1 = RMem( pAddr1 )
        set pAddr2 = RMem( pAddr2 )
        if ( pAddr1 == -1 and pAddr2 == -1 ) or pAddr1 == 0 or pAddr2 == 0 then
            return
        endif
        set pOff1 = GetSomeAddressForAbility( pAddr1, pAddr2 )
        loop
            exitwhen pOff1 <= 0
            set id = RMem( pOff1 + 0x34 )
            if id != 'Amov' and id != 'AHer' and id != 'Aatk' and id != 'AInv' then
                call SaveInteger( gg_htb_HashData, h, i, pOff1 )//address
                call SaveInteger( gg_htb_HashData, h + 1, i, RMem( pOff1 + 0x34 ) )//ability id
                set i = i + 1
            endif
            set pOff1 = GetSomeAddressForAbility( RMem( pOff1 + 36 ), RMem( pOff1 + 40 ) )
        endloop
        call SaveInteger( gg_htb_HashData, 'abil', 0, i )
    endfunction


    function CallFastCallWith1Args takes integer pFuncFastcallAddr, integer arg1 returns integer
        local integer pOffset1
        if RMem( pCallFastCallWith1Args ) == 0 then
            call WMem( pCallFastCallWith1Args, 0xB9F68B56 )
            call WMem( pCallFastCallWith1Args + 8, 0xBEF68B90 )
            call WMem( pCallFastCallWith1Args + 16, 0xC35ED6FF )
        endif
        call WMem( pCallFastCallWith1Args + 4, arg1 )
        call WMem( pCallFastCallWith1Args + 12, pFuncFastcallAddr )
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallFastCallWith1Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallFastCallWith1Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction


    function CallFastCallWith2Args takes integer pFuncFastcallAddr, integer arg1, integer arg2 returns integer
        local integer pOffset1
        if RMem( pCallFastCallWith2Args ) == 0 then
            call WMem( pCallFastCallWith2Args, 0xBAF68B56 )
            call WMem( pCallFastCallWith2Args + 8, 0xB9F68B90 )
            call WMem( pCallFastCallWith2Args + 16, 0xBEF68B90 )
            call WMem( pCallFastCallWith2Args + 24, 0xC35ED6FF )
        endif
        call WMem( pCallFastCallWith2Args + 4, arg2 )
        call WMem( pCallFastCallWith2Args + 12, arg1 )
        call WMem( pCallFastCallWith2Args + 20, pFuncFastcallAddr )
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallFastCallWith2Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallFastCallWith2Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction


    function CallFastCallWith3Args takes integer pFuncFastcallAddr, integer arg1, integer arg2, integer arg3 returns integer
        local integer pOffset1
        if RMem( pCallFastCallWith3Args ) == 0 then
            call WMem( pCallFastCallWith3Args, 0x68F68B56 )
            call WMem( pCallFastCallWith3Args + 8, 0xBAF68B90 )
            call WMem( pCallFastCallWith3Args + 16, 0xB9F68B90 )
            call WMem( pCallFastCallWith3Args + 24, 0xBEF68B90 )
            call WMem( pCallFastCallWith3Args + 32, 0xC35ED6FF )
        endif
        call WMem( pCallFastCallWith3Args + 4, arg3 )
        call WMem( pCallFastCallWith3Args + 12, arg2 )
        call WMem( pCallFastCallWith3Args + 20, arg1 )
        call WMem( pCallFastCallWith3Args + 28, pFuncFastcallAddr )
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallFastCallWith3Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallFastCallWith3Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function FUCKINGCallWith4Args takes integer pFuncFastcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4 returns integer
        local integer pOffset1
        if RMem( pFUCKINGCallWith4Args ) == 0 then
            call WMem( pFUCKINGCallWith4Args, 0x68F68B56 )
            call WMem( pFUCKINGCallWith4Args + 8, 0x68F68B90 )
            call WMem( pFUCKINGCallWith4Args + 16, 0xB8F68B90 )
            call WMem( pFUCKINGCallWith4Args + 24, 0xBFF68B90 )
            call WMem( pFUCKINGCallWith4Args + 32, 0xBEF68B90 )
            call WMem( pFUCKINGCallWith4Args + 40, 0xC35ED6FF )
        endif
        call WMem( pFUCKINGCallWith4Args + 4, arg4 )
        call WMem( pFUCKINGCallWith4Args + 12, arg3 )
        call WMem( pFUCKINGCallWith4Args + 20, arg2 )
        call WMem( pFUCKINGCallWith4Args + 28, arg1 )
        call WMem( pFUCKINGCallWith4Args + 36, pFuncFastcallAddr )
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pFUCKINGCallWith4Args )
        else
            call WMem( pIgnoredUnitsOffset, pFUCKINGCallWith4Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallFastCallWith4Args takes integer pFuncFastcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4 returns integer
        local integer pOffset1
        if RMem( pCallFastCallWith4Args ) == 0 then
            call WMem( pCallFastCallWith4Args, 0x68F68B56 )
            call WMem( pCallFastCallWith4Args + 8, 0x68F68B90 )
            call WMem( pCallFastCallWith4Args + 16, 0xBAF68B90 )
            call WMem( pCallFastCallWith4Args + 24, 0xB9F68B90 )
            call WMem( pCallFastCallWith4Args + 32, 0xBEF68B90 )
            call WMem( pCallFastCallWith4Args + 40, 0xC35ED6FF )
        endif
        call WMem( pCallFastCallWith4Args + 4, arg4 )
        call WMem( pCallFastCallWith4Args + 12, arg3 )
        call WMem( pCallFastCallWith4Args + 20, arg2 )
        call WMem( pCallFastCallWith4Args + 28, arg1 )
        call WMem( pCallFastCallWith4Args + 36, pFuncFastcallAddr )
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallFastCallWith4Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallFastCallWith4Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( 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
        if RMem( pCallFastCallWith5Args ) == 0 then
            call WMem( pCallFastCallWith5Args, 0x68F68B56 )
            call WMem( pCallFastCallWith5Args + 8, 0x68F68B90 )
            call WMem( pCallFastCallWith5Args + 16, 0x68F68B90 )
            call WMem( pCallFastCallWith5Args + 24, 0xBAF68B90 )
            call WMem( pCallFastCallWith5Args + 32, 0xB9F68B90 )
            call WMem( pCallFastCallWith5Args + 40, 0xBEF68B90 )
            call WMem( pCallFastCallWith5Args + 48, 0xC35ED6FF )
        endif
        call WMem( pCallFastCallWith5Args + 4, arg5 )
        call WMem( pCallFastCallWith5Args + 12, arg4 )
        call WMem( pCallFastCallWith5Args + 20, arg3 )
        call WMem( pCallFastCallWith5Args + 28, arg2 )
        call WMem( pCallFastCallWith5Args + 36, arg1 )
        call WMem( pCallFastCallWith5Args + 44, pFuncFastcallAddr )
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallFastCallWith5Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallFastCallWith5Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( 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
        if RMem( pCallFastCallWith6Args ) == 0 then
            call WMem( pCallFastCallWith6Args, 0x68F68B56 )
            call WMem( pCallFastCallWith6Args + 8, 0x68F68B90 )
            call WMem( pCallFastCallWith6Args + 16, 0x68F68B90 )
            call WMem( pCallFastCallWith6Args + 24, 0x68F68B90 )
            call WMem( pCallFastCallWith6Args + 32, 0xBAF68B90 )
            call WMem( pCallFastCallWith6Args + 40, 0xB9F68B90 )
            call WMem( pCallFastCallWith6Args + 48, 0xBEF68B90 )
            call WMem( pCallFastCallWith6Args + 56, 0xC35ED6FF )
        endif
        call WMem( pCallFastCallWith6Args + 4, arg6 )
        call WMem( pCallFastCallWith6Args + 12, arg5 )
        call WMem( pCallFastCallWith6Args + 20, arg4 )
        call WMem( pCallFastCallWith6Args + 28, arg3 )
        call WMem( pCallFastCallWith6Args + 36, arg2 )
        call WMem( pCallFastCallWith6Args + 44, arg1 )
        call WMem( pCallFastCallWith6Args + 52, pFuncFastcallAddr )
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallFastCallWith6Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallFastCallWith6Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( 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
        if RMem( pCallFastCallWith7Args ) == 0 then
            call WMem( pCallFastCallWith7Args, 0x68F68B56 )
            call WMem( pCallFastCallWith7Args + 8, 0x68F68B90 )
            call WMem( pCallFastCallWith7Args + 16, 0x68F68B90 )
            call WMem( pCallFastCallWith7Args + 24, 0x68F68B90 )
            call WMem( pCallFastCallWith7Args + 32, 0x68F68B90 )
            call WMem( pCallFastCallWith7Args + 40, 0xBAF68B90 )
            call WMem( pCallFastCallWith7Args + 48, 0xB9F68B90 )
            call WMem( pCallFastCallWith7Args + 56, 0xBEF68B90 )
            call WMem( pCallFastCallWith7Args + 64, 0xC35ED6FF )
        endif
        call WMem( pCallFastCallWith7Args + 4, arg7 )
        call WMem( pCallFastCallWith7Args + 12, arg6 )
        call WMem( pCallFastCallWith7Args + 20, arg5 )
        call WMem( pCallFastCallWith7Args + 28, arg4 )
        call WMem( pCallFastCallWith7Args + 36, arg3 )
        call WMem( pCallFastCallWith7Args + 44, arg2 )
        call WMem( pCallFastCallWith7Args + 52, arg1 )
        call WMem( pCallFastCallWith7Args + 60, pFuncFastcallAddr )
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallFastCallWith7Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallFastCallWith7Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( 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
        if RMem( pCallFastCallWith8Args ) == 0 then
            call WMem( pCallFastCallWith8Args, 0x68F68B56 )
            call WMem( pCallFastCallWith8Args + 8, 0x68F68B90 )
            call WMem( pCallFastCallWith8Args + 16, 0x68F68B90 )
            call WMem( pCallFastCallWith8Args + 24, 0x68F68B90 )
            call WMem( pCallFastCallWith8Args + 32, 0x68F68B90 )
            call WMem( pCallFastCallWith8Args + 40, 0x68F68B90 )
            call WMem( pCallFastCallWith8Args + 48, 0xBAF68B90 )
            call WMem( pCallFastCallWith8Args + 56, 0xB9F68B90 )
            call WMem( pCallFastCallWith8Args + 64, 0xBEF68B90 )
            call WMem( pCallFastCallWith8Args + 72, 0xC35ED6FF )
        endif
        call WMem( pCallFastCallWith8Args + 4, arg8 )
        call WMem( pCallFastCallWith8Args + 12, arg7 )
        call WMem( pCallFastCallWith8Args + 20, arg6 )
        call WMem( pCallFastCallWith8Args + 28, arg5 )
        call WMem( pCallFastCallWith8Args + 36, arg4 )
        call WMem( pCallFastCallWith8Args + 44, arg3 )
        call WMem( pCallFastCallWith8Args + 52, arg2 )
        call WMem( pCallFastCallWith8Args + 60, arg1 )
        call WMem( pCallFastCallWith8Args + 68, pFuncFastcallAddr )
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallFastCallWith8Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallFastCallWith8Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallFastCallWith11Args takes integer pFuncFastcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4, integer arg5, integer arg6, integer arg7, integer arg8, integer arg9, integer arg10, integer arg11 returns integer
        local integer pOffset1
        if RMem( pCallFastCallWith11Args ) == 0 then
            call WMem( pCallFastCallWith11Args, 0x68F68B56 )
            call WMem( pCallFastCallWith11Args + 8, 0x68F68B90 )
            call WMem( pCallFastCallWith11Args + 16, 0x68F68B90 )
            call WMem( pCallFastCallWith11Args + 24, 0x68F68B90 )
            call WMem( pCallFastCallWith11Args + 32, 0x68F68B90 )
            call WMem( pCallFastCallWith11Args + 40, 0x68F68B90 )
            call WMem( pCallFastCallWith11Args + 48, 0x68F68B90 )
            call WMem( pCallFastCallWith11Args + 56, 0x68F68B90 )
            call WMem( pCallFastCallWith11Args + 64, 0x68F68B90 )
            call WMem( pCallFastCallWith11Args + 72, 0xBAF68B90 )
            call WMem( pCallFastCallWith11Args + 80, 0xB9F68B90 )
            call WMem( pCallFastCallWith11Args + 88, 0xBEF68B90 )
            call WMem( pCallFastCallWith11Args + 96, 0xC35ED6FF )
        endif
        call WMem( pCallFastCallWith11Args + 4, arg11 )
        call WMem( pCallFastCallWith11Args + 12, arg10 )
        call WMem( pCallFastCallWith11Args + 20, arg9 )
        call WMem( pCallFastCallWith11Args + 28, arg8 )
        call WMem( pCallFastCallWith11Args + 36, arg7 )
        call WMem( pCallFastCallWith11Args + 44, arg6 )
        call WMem( pCallFastCallWith11Args + 52, arg5 )
        call WMem( pCallFastCallWith11Args + 60, arg4 )
        call WMem( pCallFastCallWith11Args + 68, arg3 )
        call WMem( pCallFastCallWith11Args + 76, arg2 )
        call WMem( pCallFastCallWith11Args + 84, arg1 )
        call WMem( pCallFastCallWith11Args + 92, pFuncFastcallAddr )
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallFastCallWith11Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallFastCallWith11Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallFastCallWith12Args takes integer pFuncFastcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4, integer arg5, integer arg6, integer arg7, integer arg8, integer arg9, integer arg10, integer arg11, integer arg12 returns integer
        local integer pOffset1
        if RMem( pCallFastCallWith12Args ) == 0 then
            call WMem( pCallFastCallWith12Args, 0x68F68B56 )
            call WMem( pCallFastCallWith12Args + 8, 0x68F68B90 )
            call WMem( pCallFastCallWith12Args + 16, 0x68F68B90 )
            call WMem( pCallFastCallWith12Args + 24, 0x68F68B90 )
            call WMem( pCallFastCallWith12Args + 32, 0x68F68B90 )
            call WMem( pCallFastCallWith12Args + 40, 0x68F68B90 )
            call WMem( pCallFastCallWith12Args + 48, 0x68F68B90 )
            call WMem( pCallFastCallWith12Args + 56, 0x68F68B90 )
            call WMem( pCallFastCallWith12Args + 64, 0x68F68B90 )
            call WMem( pCallFastCallWith12Args + 72, 0x68F68B90 )
            call WMem( pCallFastCallWith12Args + 80, 0xBAF68B90 )
            call WMem( pCallFastCallWith12Args + 88, 0xB9F68B90 )
            call WMem( pCallFastCallWith12Args + 96, 0xBEF68B90 )
            call WMem( pCallFastCallWith12Args + 104, 0xC35ED6FF )
        endif
        call WMem( pCallFastCallWith12Args + 4, arg12 )
        call WMem( pCallFastCallWith12Args + 12, arg11 )
        call WMem( pCallFastCallWith12Args + 20, arg10 )
        call WMem( pCallFastCallWith12Args + 28, arg9 )
        call WMem( pCallFastCallWith12Args + 36, arg8 )
        call WMem( pCallFastCallWith12Args + 44, arg7 )
        call WMem( pCallFastCallWith12Args + 52, arg6 )
        call WMem( pCallFastCallWith12Args + 60, arg5 )
        call WMem( pCallFastCallWith12Args + 68, arg4 )
        call WMem( pCallFastCallWith12Args + 76, arg3 )
        call WMem( pCallFastCallWith12Args + 84, arg2 )
        call WMem( pCallFastCallWith12Args + 92, arg1 )
        call WMem( pCallFastCallWith12Args + 100, pFuncFastcallAddr )
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallFastCallWith12Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallFastCallWith12Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( 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 CallThisCallWith10Args takes integer pFuncThiscallAddr, integer arg1, integer arg2, integer arg3, integer arg4, integer arg5, integer arg6, integer arg7, integer arg8, integer arg9, integer arg10 returns integer
        return CallFastCallWith11Args( pFuncThiscallAddr, arg1, 0, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10 )
    endfunction

    function CallThisCallWith11Args takes integer pFuncThiscallAddr, integer arg1, integer arg2, integer arg3, integer arg4, integer arg5, integer arg6, integer arg7, integer arg8, integer arg9, integer arg10, integer arg11 returns integer
        return CallFastCallWith12Args( pFuncThiscallAddr, arg1, 0, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11 )
    endfunction
    
    function CallStdcallWith1Args takes integer pFuncStdcallAddr, integer arg1 returns integer
        local integer pOffset1
        if RMem( pCallStdcallWith1Args ) == 0 then
            call WMem( pCallStdcallWith1Args, 0x68C98B51 ) // push ecx. mov ecx, ecx
            call WMem( pCallStdcallWith1Args + 8, 0xB990C98B ) // mov ecx, ecx , nop
            call WMem( pCallStdcallWith1Args + 16, 0xC359D1FF ) // call ecx, pop ecx, ret
        endif
        call WMem( pCallStdcallWith1Args + 4, arg1 ) // push arg1
        call WMem( pCallStdcallWith1Args + 12, pFuncStdcallAddr ) // mov ecx, pFuncStdcallAddr
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallStdcallWith1Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallStdcallWith1Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallStdcallWith2Args takes integer pFuncStdcallAddr, integer arg1, integer arg2 returns integer
        local integer pOffset1
        if RMem( pCallStdcallWith2Args ) == 0 then
            call WMem( pCallStdcallWith2Args, 0x68C98B51 ) // push ecx. mov ecx, ecx
            call WMem( pCallStdcallWith2Args + 8, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith2Args + 16, 0xB990C98B ) // mov ecx, ecx , nop
            call WMem( pCallStdcallWith2Args + 24, 0xC359D1FF ) // call ecx, pop ecx, ret
        endif
        call WMem( pCallStdcallWith2Args + 4, arg2 ) // push arg2
        call WMem( pCallStdcallWith2Args + 12, arg1 ) // push arg1
        call WMem( pCallStdcallWith2Args + 20, pFuncStdcallAddr ) // mov ecx, pFuncStdcallAddr
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallStdcallWith2Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallStdcallWith2Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallStdcallWith3Args takes integer pFuncStdcallAddr, integer arg1, integer arg2, integer arg3 returns integer
        local integer pOffset1
        if RMem( pCallStdcallWith3Args ) == 0 then
            call WMem( pCallStdcallWith3Args, 0x68C98B51 ) // push ecx. mov ecx, ecx
            call WMem( pCallStdcallWith3Args + 8, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith3Args + 16, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith3Args + 24, 0xB990C98B ) // mov ecx, ecx , nop
            call WMem( pCallStdcallWith3Args + 32, 0xC359D1FF ) // call ecx, pop ecx, ret
        endif
        call WMem( pCallStdcallWith3Args + 4, arg3 ) // push arg3
        call WMem( pCallStdcallWith3Args + 12, arg2 ) // push arg2
        call WMem( pCallStdcallWith3Args + 20, arg1 ) // push arg1
        call WMem( pCallStdcallWith3Args + 28, pFuncStdcallAddr ) // mov ecx, pFuncStdcallAddr
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallStdcallWith3Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallStdcallWith3Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallStdcallWith4Args takes integer pFuncStdcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4 returns integer
        local integer pOffset1
        if RMem( pCallStdcallWith4Args ) == 0 then
            call WMem( pCallStdcallWith4Args, 0x68C98B51 ) // push ecx. mov ecx, ecx
            call WMem( pCallStdcallWith4Args + 8, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith4Args + 16, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith4Args + 24, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith4Args + 32, 0xB990C98B ) // mov ecx, ecx , nop
            call WMem( pCallStdcallWith4Args + 40, 0xC359D1FF ) // call ecx, pop ecx, ret
        endif
        call WMem( pCallStdcallWith4Args + 4, arg4 ) // push arg4
        call WMem( pCallStdcallWith4Args + 12, arg3 ) // push arg3
        call WMem( pCallStdcallWith4Args + 20, arg2 ) // push arg2
        call WMem( pCallStdcallWith4Args + 28, arg1 ) // push arg1
        call WMem( pCallStdcallWith4Args + 36, pFuncStdcallAddr ) // mov ecx, pFuncStdcallAddr
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallStdcallWith4Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallStdcallWith4Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallStdcallWith5Args takes integer pFuncStdcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4, integer arg5 returns integer
        local integer pOffset1
        if RMem( pCallStdcallWith5Args ) == 0 then
            call WMem( pCallStdcallWith5Args, 0x68C98B51 ) // push ecx. mov ecx, ecx
            call WMem( pCallStdcallWith5Args + 8, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith5Args + 16, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith5Args + 24, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith5Args + 32, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith5Args + 40, 0xB990C98B ) // mov ecx, ecx , nop
            call WMem( pCallStdcallWith5Args + 48, 0xC359D1FF ) // call ecx, pop ecx, ret
        endif
        call WMem( pCallStdcallWith5Args + 4, arg5 ) // push arg5
        call WMem( pCallStdcallWith5Args + 12, arg4 ) // push arg4
        call WMem( pCallStdcallWith5Args + 20, arg3 ) // push arg3
        call WMem( pCallStdcallWith5Args + 28, arg2 ) // push arg2
        call WMem( pCallStdcallWith5Args + 36, arg1 ) // push arg1
        call WMem( pCallStdcallWith5Args + 44, pFuncStdcallAddr ) // mov ecx, pFuncStdcallAddr
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallStdcallWith5Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallStdcallWith5Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallStdcallWith6Args takes integer pFuncStdcallAddr, integer arg1, integer arg2, integer arg3 , integer arg4, integer arg5 , integer arg6 returns integer
        local integer pOffset1
        if RMem( pCallStdcallWith6Args ) == 0 then
            call WMem( pCallStdcallWith6Args, 0x68C98B51 ) // push ecx. mov ecx, ecx
            call WMem( pCallStdcallWith6Args + 8, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith6Args + 16, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith6Args + 24, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith6Args + 32, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith6Args + 40, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallStdcallWith6Args + 48, 0xB990C98B ) // mov ecx, ecx , nop
            call WMem( pCallStdcallWith6Args + 56, 0xC359D1FF ) // call ecx, pop ecx, ret
        endif
        call WMem( pCallStdcallWith6Args + 4, arg6 ) // push arg6
        call WMem( pCallStdcallWith6Args + 12, arg5 ) // push arg5
        call WMem( pCallStdcallWith6Args + 20, arg4 ) // push arg4
        call WMem( pCallStdcallWith6Args + 28, arg3 ) // push arg3
        call WMem( pCallStdcallWith6Args + 36, arg2 ) // push arg2
        call WMem( pCallStdcallWith6Args + 44, arg1 ) // push arg1
        call WMem( pCallStdcallWith6Args + 52, pFuncStdcallAddr ) // mov ecx, pFuncStdcallAddr
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallStdcallWith6Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallStdcallWith6Args )
        endif
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallCdeclWith1Args takes integer pFuncCdeclAddr, integer arg1 returns integer
        local integer pOffset1
        if RMem( pCallCdeclWith1Args ) == 0 then
            call WMem( pCallCdeclWith1Args, 0x68C98B51 ) // push ecx. mov ecx, ecx
            call WMem( pCallCdeclWith1Args + 8, 0xB990C98B ) // mov ecx, ecx , nop
            call WMem( pCallCdeclWith1Args + 16, 0xC483D1FF ) // call ecx, add esp, 
            call WMem( pCallCdeclWith1Args + 20, 0xCCC35904 ) // 4, pop ecx, ret
        endif
        call WMem( pCallCdeclWith1Args + 4, arg1 ) // push arg1
        call WMem( pCallCdeclWith1Args + 12, pFuncCdeclAddr ) // mov ecx, pFuncCdeclAddr
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallCdeclWith1Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallCdeclWith1Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallCdeclWith2Args takes integer pFuncCdeclAddr, integer arg1, integer arg2 returns integer
        local integer pOffset1
        if RMem( pCallCdeclWith2Args ) == 0 then
            call WMem( pCallCdeclWith2Args, 0x68C98B51 ) // push ecx. mov ecx, ecx
            call WMem( pCallCdeclWith2Args + 8, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith2Args + 16, 0xB990C98B ) // mov ecx, ecx , nop
            call WMem( pCallCdeclWith2Args + 24, 0xC483D1FF ) // call ecx, add esp, 
            call WMem( pCallCdeclWith2Args + 28, 0xCCC35908 ) // 4, pop ecx, ret
        endif
        call WMem( pCallCdeclWith2Args + 4, arg2 ) // push arg2
        call WMem( pCallCdeclWith2Args + 12, arg1 ) // push arg1
        call WMem( pCallCdeclWith2Args + 20, pFuncCdeclAddr ) // mov ecx, pFuncCdeclAddr
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallCdeclWith2Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallCdeclWith2Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallCdeclWith3Args takes integer pFuncCdeclAddr, integer arg1, integer arg2, integer arg3 returns integer
        local integer pOffset1
        if RMem( pCallCdeclWith3Args ) == 0 then
            call WMem( pCallCdeclWith3Args, 0x68C98B51 ) // push ecx. mov ecx, ecx
            call WMem( pCallCdeclWith3Args + 8, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith3Args + 16, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith3Args + 24, 0xB990C98B ) // mov ecx, ecx , nop
            call WMem( pCallCdeclWith3Args + 32, 0xC483D1FF ) // call ecx, add esp, 
            call WMem( pCallCdeclWith3Args + 36, 0xCCC3590C ) // 4, pop ecx, ret
        endif
        call WMem( pCallCdeclWith3Args + 4, arg3 ) // push arg3
        call WMem( pCallCdeclWith3Args + 12, arg2 ) // push arg2
        call WMem( pCallCdeclWith3Args + 20, arg1 ) // push arg1
        call WMem( pCallCdeclWith3Args + 28, pFuncCdeclAddr ) // mov ecx, pFuncCdeclAddr
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallCdeclWith3Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallCdeclWith3Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallCdeclWith4Args takes integer pFuncCdeclAddr, integer arg1, integer arg2, integer arg3 , integer arg4 returns integer
        local integer pOffset1
        if RMem( pCallCdeclWith4Args ) == 0 then
            call WMem( pCallCdeclWith4Args, 0x68C98B51 ) // push ecx. mov ecx, ecx
            call WMem( pCallCdeclWith4Args + 8, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith4Args + 16, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith4Args + 24, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith4Args + 32, 0xB990C98B ) // mov ecx, ecx , nop
            call WMem( pCallCdeclWith4Args + 40, 0xC483D1FF ) // call ecx, add esp, 
            call WMem( pCallCdeclWith4Args + 44, 0xCCC35910 ) // 4, pop ecx, ret
        endif
        call WMem( pCallCdeclWith4Args + 4, arg4 ) // push arg4
        call WMem( pCallCdeclWith4Args + 12, arg3 ) // push arg3
        call WMem( pCallCdeclWith4Args + 20, arg2 ) // push arg2
        call WMem( pCallCdeclWith4Args + 28, arg1 ) // push arg1
        call WMem( pCallCdeclWith4Args + 36, pFuncCdeclAddr ) // mov ecx, pFuncCdeclAddr
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallCdeclWith4Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallCdeclWith4Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallCdeclWith5Args takes integer pFuncCdeclAddr, integer arg1, integer arg2, integer arg3 , integer arg4, integer arg5 returns integer
        local integer pOffset1
        if RMem( pCallCdeclWith5Args ) == 0 then
            call WMem( pCallCdeclWith5Args, 0x68C98B51 ) // push ecx. mov ecx, ecx
            call WMem( pCallCdeclWith5Args + 8, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith5Args + 16, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith5Args + 24, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith5Args + 32, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith5Args + 40, 0xB990C98B ) // mov ecx, ecx , nop
            call WMem( pCallCdeclWith5Args + 48, 0xC483D1FF ) // call ecx, add esp, 
            call WMem( pCallCdeclWith5Args + 52, 0xCCC35914 ) // 4, pop ecx, ret
        endif
        call WMem( pCallCdeclWith5Args + 4, arg5 ) // push arg5
        call WMem( pCallCdeclWith5Args + 12, arg4 ) // push arg4
        call WMem( pCallCdeclWith5Args + 20, arg3 ) // push arg3
        call WMem( pCallCdeclWith5Args + 28, arg2 ) // push arg2
        call WMem( pCallCdeclWith5Args + 36, arg1 ) // push arg1
        call WMem( pCallCdeclWith5Args + 44, pFuncCdeclAddr ) // mov ecx, pFuncCdeclAddr
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallCdeclWith5Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallCdeclWith5Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction

    function CallCdeclWith6Args takes integer pFuncCdeclAddr, integer arg1, integer arg2, integer arg3 , integer arg4, integer arg5 , integer arg6 returns integer
        local integer pOffset1
	
        if RMem( pCallCdeclWith6Args ) == 0 then
            call WMem( pCallCdeclWith6Args, 0x68C98B51 ) // push ecx. mov ecx, ecx
            call WMem( pCallCdeclWith6Args + 8, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith6Args + 16, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith6Args + 24, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith6Args + 32, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith6Args + 40, 0x6890C98B ) // mov ecx, ecx
            call WMem( pCallCdeclWith6Args + 48, 0xB990C98B ) // mov ecx, ecx , nop
            call WMem( pCallCdeclWith6Args + 56, 0xC483D1FF ) // call ecx, add esp, 
            call WMem( pCallCdeclWith6Args + 60, 0xCCC35918 ) // 4, pop ecx, ret
        endif
        call WMem( pCallCdeclWith6Args + 4, arg6 ) // push arg6
        call WMem( pCallCdeclWith6Args + 12, arg5 ) // push arg5
        call WMem( pCallCdeclWith6Args + 20, arg4 ) // push arg4
        call WMem( pCallCdeclWith6Args + 28, arg3 ) // push arg3
        call WMem( pCallCdeclWith6Args + 36, arg2 ) // push arg2
        call WMem( pCallCdeclWith6Args + 44, arg1 ) // push arg1
        call WMem( pCallCdeclWith6Args + 52, pFuncCdeclAddr ) // mov ecx, pFuncCdeclAddr
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pCallCdeclWith6Args )
        else
            call WMem( pIgnoredUnitsOffset, pCallCdeclWith6Args )
        endif
	
        set pOffset1 = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        return pOffset1
    endfunction
    
    function ConvertNullTerminatedStringToString takes integer pNullTerminatedString returns string
        if pNullTerminatedString > 0 then
            return I2SH( CallThisCallWith1Args( pConvertString, pNullTerminatedString ) )
        endif
        return null
    endfunction
    
    function GetUnitAbilityReal takes integer UnitAddress, integer AbilCode, integer unk1, integer unk2, integer unk3, integer unk4 returns integer
        return CallThisCallWith6Args( pGetUnitAbility, UnitAddress, AbilCode, unk1, unk2, unk3, unk4 )
    endfunction

    function GetUnitAddress takes unit u returns integer
        return CallThisCallWith1Args( pGetUnitAddress, GetHandleId( u ) )
    endfunction
    
    function GetModuleHandle takes string nDllName returns integer
        return CallStdcallWith1Args( RMem( pGetModuleHandle ), GetStringAddress( nDllName ) )
    endfunction

    function GetModuleProcAddress takes string nDllName, string nProcName returns integer
        return CallStdcallWith2Args( RMem( pGetProcAddress ), GetModuleHandle( nDllName ), GetStringAddress( nProcName ) )
    endfunction
    
    function GetUnitAbility takes unit u, integer abilid returns integer
        local integer a
        if u == null or abilid < 1 or GetUnitAbilityLevel( u, abilid ) == 0 then
            return 0
        endif
        set a = ConvertHandle( u )//GetUnitAddress( u )
	//call echo(Int2Hex(a)+" "+Int2Hex(ConvertHandle(u)))
        if a > 1 then
            return CallThisCallWith6Args( pGetUnitAbility, a, abilid, 0, 1, 1, 1 )
        endif
        return 0
    endfunction

    function GetUnitAbilityByBase takes unit u, integer abilid returns integer
        local integer a
        if u == null or abilid < 1 then
            return 0
        endif
        set a = ConvertHandle( u )//GetUnitAddress( u )
	//call echo(Int2Hex(a)+" "+Int2Hex(ConvertHandle(u)))
        if a > 1 then
            return CallThisCallWith6Args( pGetUnitAbility, a, abilid, 0, 0, 1, 1 )
        endif
        return 0
    endfunction

    function GetUnitAbilityByAddress takes integer u, integer abilid returns integer
        return CallThisCallWith6Args( pGetUnitAbility, u, abilid, 0, 1, 1, 1 )
    endfunction

    function GetAbilityOrderIdAny takes integer a returns integer
        local integer base = RMem( a + 0x54 )
        if base != 0 and RMem( a + 0x6C ) != 0 then
            set base = RMem( base + 0x30 )
            if base > 0 then
                if base == 'ANcl' then
                    return RMem( a + 0x124 )
                else
                    return GetAbilityOrderID( a )
                endif
            endif
        endif
        return 0
    endfunction

    function ShowAbilityById_Main takes integer ConvertedHandle, integer d returns nothing
        if ConvertedHandle > 0 and RMem( ConvertedHandle ) > 0 then
            call WMem( ConvertedHandle + 0x40, RMem( ConvertedHandle + 0x40 ) + d )
        endif
    endfunction

    function StartAbilityCooldown takes unit whichUnit, integer abilityId, real cd returns boolean
        local integer pAbility = 0
        if GetUnitAbilityLevel( whichUnit, abilityId ) == 0 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 )
                if not InGame then
                    call BJDebugMsg( "Start Cooldown WARNING!" )
                    call BJDebugMsg( "ADRESS-VAL1-VAL2" )
                    call BJDebugMsg( Int2Hex(pAbility)+" - "+Int2Hex(RMem( pAbility + 0x134 ))+" - "+Int2Hex(RMem( pAbility + 0x134 )))
                    call BJDebugMsg( "abil-"+Id2String(abilityId) +" owner-"+ Int2Hex(pAbility)  )
                endif
            endif
            set Memory[pReserverdIntArg1 / 4] = mR2I( cd )
            call CallThisCallWith2Args( pStartAbilityCD, pAbility, pReserverdIntArg1 )
            return IsAbilityOnCooldown( pAbility )
        endif
        return false
    endfunction
    
    function DisableUnitAbilityById takes unit whichUnit, integer id, boolean flag returns boolean
        local integer pAbility = 0
        local integer pDisableCount = 0
    
        if whichUnit == null or id == 0 or GetUnitAbilityLevel( whichUnit, id ) < 1 then
            return false
        endif
    
        set pAbility = GetUnitAbilityForAddresss( ConvertHandle( whichUnit ), id )
        
        set pDisableCount = RMem( pAbility + 0x3C )
        
        if pDisableCount < 0 then 
            call BJDebugMsg( DEBUG + " счетчик безмолвия не верен - " + Int2Hex( pAbility ) + " = " + I2S( pDisableCount ) )
            call BJDebugMsg( INFO )
        endif
        
        if flag then
            call SetAbilityDisabled( pAbility, pDisableCount + 1 )
        else
            call SetAbilityDisabled( pAbility, IMaxBJ( pDisableCount - 1, 0 ) )
        endif
        
        return true
    endfunction
    
    function HideAbilityButton takes unit u, integer id, boolean hide returns nothing
        local integer offset
        if u != null and id != 0 then
            set offset = GetUnitAbility( u, id )
            if offset != 0 then
                if hide then
                    call ShowAbilityById_Main( offset, 1 )
                else
                    call ShowAbilityById_Main( offset, -1 )
                endif
            endif
        endif
    endfunction
   
    function GetAbilityUIDefById takes integer id returns integer
        local integer a = CallThisCallWith1Args( pGetAbilityUIDefAlt, id )
        if a > 0 then
            return a + 4
        endif
        return a
    endfunction
    
    
    function GetAbilityUIDefCaching takes integer id returns integer
        local integer a
        if HaveSavedInteger( ObjectDataPointersTable, DEF_ADR_ABILITY_UI, id ) then
            return LoadInteger( ObjectDataPointersTable, DEF_ADR_ABILITY_UI, id )
        endif
        set a = GetAbilityUIDefById( id )
        if a > 0 then
            call SaveInteger( ObjectDataPointersTable, DEF_ADR_ABILITY_UI, id, a )
        endif
        return a
    endfunction

    function GetAbilityStringParam takes integer id, integer off returns string
        local integer k = GetAbilityUIDefCaching( id )
        if k < 1 then
            return ""
        endif
//	call echo(Int2Hex(k))
        set k = k + off
        if RMem( k ) > 0 then
            return ConvertNullTerminatedStringToString( RMem( k ) )
        endif
        return ""
    endfunction

    function SetAbilityStringParam takes integer id, integer off, string newVal returns boolean
        local integer k = GetAbilityUIDefCaching( id )
        if k < 1 then
            return false
        endif
        call WMem( k + off, GetStringAddress( newVal ) )
        return true
    endfunction

    function GetAbilityStringParam2 takes integer id, integer off, integer lvl returns string
        local integer k = GetAbilityUIDefCaching( id )
        if k < 1 then
            return null
        endif
        set k = k + off
        set lvl = lvl - 1
        if RMem( k ) + lvl * 4 > 0 then
            return ConvertNullTerminatedStringToString( RMem( RMem( k ) + lvl * 4 ) )
        endif
        return null
    endfunction

    function SetAbilityStringParam2 takes integer id, integer off, string newVal, integer lvl returns boolean
        local integer k = GetAbilityUIDefCaching( id )
        if k < 1 then
            return false
        endif
        set k = k + off
        if RMem( k ) > 0 then
            call WMem( RMem( k + lvl * 4 - 4 ), GetStringAddress( newVal ) )
            return true
        endif
        return false
    endfunction
    
    function SetAbilityUbertip takes integer id, integer lvl, string s returns boolean
        return SetAbilityStringParam2( id, 0x158, s, lvl )
    endfunction

    function GetAbilityUbertip takes integer id, integer lvl returns string
        return GetAbilityStringParam2( id, 0x158, lvl )
    endfunction

    function ChangeItemId takes item it, integer targetID returns nothing
        local integer cid = ConvertHandle( it )
        local integer curID
        if cid < 1 then
            return
        endif
        set curID = RMem( cid + 0x30 )
        call WMem( cid + 0x30, targetID )
    endfunction

    function Player2Flag takes player p returns integer
        return R2I( Pow( 2, GetPlayerId( p ) ) )
    endfunction

    function GetUnitVisibilityClass takes unit u returns integer
        local integer a = ConvertHandle( u )
        local integer res = 0
        if a > 0 then
            set res = RMem( a + 0x130 )
            if res > 0 then
                set res = GetSomeAddressForAbility( res, RMem( a + 0x134 ) )
            endif
        endif
        return res
    endfunction

    function GetUnitDetectedClass takes unit u returns integer
        local integer a = ConvertHandle( u )
        local integer res = 0
        if a > 0 then
            set res = RMem( a + 0x13C )
            if res > 0 then
                set res = GetSomeAddressForAbility( res, RMem( a + 0x140 ) )
            endif
        endif
        return res
    endfunction

    function SetEffectSize takes effect e, real size returns nothing
        set Memory[Memory[ConvertHandle( e ) / 4 + 0x28 / 4] / 4 + 0xE8 / 4] = cleanInt( realToIndex( size ) )
    endfunction

    function AddAlwaysVisibleFlag takes unit u, boolean flag returns nothing
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 1 then
            if flag and IsFlagBitSet( RMem( LastConvertedHandle + 0x20 ), 0x10 ) == false then
                call WMem( LastConvertedHandle + 0x20, RMem( LastConvertedHandle + 0x20 ) + 0x10 )
            elseif IsFlagBitSet( RMem( LastConvertedHandle + 0x20 ), 0x10 ) then
                call WMem( LastConvertedHandle + 0x20, RMem( LastConvertedHandle + 0x20 ) - 0x10 )
            endif
        endif
    endfunction

    function GetBuffLevel takes integer pBuff returns integer
        if pBuff < 1 then
            return 0
        endif
        return Memory[( pBuff + 0xb0 ) / 4] + 1
    endfunction

    function SetBuffLevel takes integer pBuff, integer level returns nothing
        if pBuff < 1 or level < 1 then
            return
        endif
        set Memory[( pBuff + 0xb0 ) / 4] = level - 1
    endfunction

    function SetUnitGreenBonusDamage takes unit u, integer i returns nothing
        set Memory[GetUnitAttackAbility( u ) / 4 + 0xAC / 4] = i
    endfunction

    function GetUnitGreenBonusDamage takes unit u returns integer
        return Memory[GetUnitAttackAbility( u ) / 4 + 0xAC / 4]
    endfunction

    function AddUnitGreenBonusDamage takes unit u, integer i returns nothing
        call SetUnitGreenBonusDamage( u, GetUnitGreenBonusDamage( u ) + i )
    endfunction
//! nocjass
    function GetUnitBaseDamage takes unit u returns integer
        return Memory[GetUnitAttackAbility( u ) / 4 + 0xA0 / 4]
    endfunction
//! endnocjass

    function RefreshUnitsCommandPanel takes unit u returns nothing
        set LastConvertedHandle = ConvertHandle( u )
        if LastConvertedHandle > 0 then
            call CallThisCallWith2Args( pRefreshUnitsCommandPanel, LastConvertedHandle, 852290 )
        endif
    endfunction

    function AddAbilityCharges takes unit u, integer id, integer c returns nothing
        local integer a = GetUnitAbility( u, id )
        if a > 0 then
            call WMem( a + 0x124, RMem( a + 0x124 ) + c )
        endif
        call RefreshUnitsCommandPanel( u )//else changes will be visible only at next redraw
    endfunction

    function IsUnitDetectedByPlayer takes unit u, player p returns boolean
	//shared vision-like effect, used for Faerie fire / Wand of evil eye
	//have no reveal effect by itself, used only as detector?
        local integer a = GetUnitDetectedClass( u )
        if a > 0 then
            return IsFlagBitSet( RMem( a + 0x24 ), Player2Flag( p ) )
        endif
        return false
    endfunction

    function RemoveAnyDetectionFromUnit takes unit u returns nothing
        local integer a = ConvertHandle( u )
        if a > 0 then
            call WMem( a + 0x148, 0 )
            call WMem( a + 0x14C, 0 )
            set a = GetUnitVisibilityClass( u )
            if a > 0 then
                call WMem( a + 0x24, 0 )
            endif
        endif
    endfunction

   
    function RecountAnyDetectionForUnit takes unit u returns nothing
        local integer a = ConvertHandle( u )
        local integer sum = 0
        local integer i = 0
        if a > 0 then
            set a = GetUnitDetectedClass( u )
            if a > 0 then
                loop
                    if RMem( a + 0x2C + 4 * i ) > 0 then
                        set sum = sum + R2I( Pow( 2, i ) )
                    endif
                    set i = i + 1
                    exitwhen i > 15
                endloop
                call WMem( a + 0x14C, sum )
                call WMem( a + 0x148, sum )
                set sum = 0
                set i = 0
            endif
            set a = GetUnitVisibilityClass( u )
            if a > 0 then
                loop
                    if RMem( a + 0x2C + 4 * i ) > 0 then
                        set sum = sum + R2I( Pow( 2, i ) )
                    endif
                    set i = i + 1
                    exitwhen i > 15
                endloop
                call WMem( a + 0x24, sum )
            endif
        endif
    endfunction

    function GetHeroAbilityFromList takes unit uHero, integer list returns integer
        set LastConvertedHandle = ConvertHandle( uHero )
    
        if IsUnitType( uHero, UNIT_TYPE_HERO ) and LastConvertedHandle > 1 and list > 0 then
            return RMem( RMem( LastConvertedHandle + 496 ) + 240 + 4 * list )
        endif

        return 0
    endfunction

    function IsUnitAbilityDisabled takes unit whichUnit, integer id returns boolean
        if whichUnit == null or id == 0 or GetUnitAbilityLevel( whichUnit, id ) < 1 then
            return false
        endif
    
        set LastConvertedHandle = GetUnitAbilityForAddresss( ConvertHandle( whichUnit ), id )
        
        if LastConvertedHandle < 1 then
            return false
        endif
        
        return GetAbilityDisabledCount( LastConvertedHandle ) > 0
    endfunction
    
    function ThrowTargetSpellTargetUnit takes unit who, integer id, widget target returns nothing
        local integer a = ConvertHandle( target )
        local integer x
        local integer y
        local integer flags
        if a > 0 and GetHandleId( who ) > 0 then
            set x = RMem( a + 0xC )
            set y = RMem( a + 0x10 )
            if x > 0 and y > 0 then
                set a = ConvertHandle( who )
                if a < 1 then
                    return
                endif
                set a = GetUnitAbility( who, id )
                if a > 0 then
                    call WMem( a + 0xE4, x )//for any target ( widget )
                    call WMem( a + 0xE8, y )
                    set flags = RMem( a + 0x20 )
                    if not IsFlagBitSet( flags, 0x10000 ) then
					//0x19804 stands for "target", 0x1F020 stands for "target item",0x9800 stands for point target
                        call WMem( a + 0x20, flags + 0x10000 )
                        set flags = flags + 0x10000
                        if not IsFlagBitSet( flags, 0x1 ) then
                            call WMem( a + 0x20, flags + 0x1 )
                        endif
                    endif
                    set a = CallThisCallWith1Args( pCastAbility, a )
                endif
            endif
        endif
    endfunction
    
    function IsCooldownUIHided takes integer pAbility returns boolean

        if pAbility < 1 then
            return false
        endif

        return IsFlagBitSet( RMem( pAbility + 0x20 ), 0x400 )
    endfunction

    function HideCooldownUIById takes unit whichUnit, integer id, boolean hide returns nothing
        local integer pAbility = GetUnitAbilityForAddresss( ConvertHandle( whichUnit ), id )
   
        if pAbility < 1 then
            return
        endif
    
        set pAbility = pAbility + 0x20
    
       if hide and not IsFlagBitSet( RMem( pAbility ), 0x400 ) then
            call WMem( pAbility, RMem( pAbility ) + 0x400 )
        elseif not hide and IsFlagBitSet( RMem( pAbility ), 0x400 ) then
            call WMem( pAbility, RMem( pAbility ) - 0x400 )
        endif

    endfunction
    
    function AllocateExecutableMemory takes integer size returns integer
        local integer retval = 0
        if pVirtualAlloc != 0 then
            if pMergeUnitsOffset == 0 then
                set pMergeUnitsOffset = CreateJassNativeHook( pMergeUnits, RMem( pVirtualAlloc ) )
            else
                call WMem( pMergeUnitsOffset, RMem( pVirtualAlloc ) )
            endif
            set retval = B2I( MergeUnits( 0, size + 4, 0x3000, 0x40 ) )
            call WMem( pMergeUnitsOffset, pMergeUnits )
        endif
	
        if retval == 0 then
            return 0
        endif
	
        return ( retval + 4 ) / 4 * 4
    endfunction
    
    function ReadSomeRegisterOffset takes integer register, integer offset returns integer
        local integer retval = 0
        call WMem( pReadStack, 0xCCC3008B + register )
	
        if pIgnoredUnitsOffset == 0 then
            set pIgnoredUnitsOffset = CreateJassNativeHook( pIgnoredUnits, pReadStack )
        else
            call WMem( pIgnoredUnitsOffset, pReadStack )
        endif
	
        set retval = IgnoredUnits( 0 )
        call WMem( pIgnoredUnitsOffset, pIgnoredUnits )
        if offset == 0 then
            return retval
        endif
        return RMem( retval + offset )
    endfunction

    function FlushInstructionCache takes integer a, integer size returns nothing
        if pFlushInstructionCache == 0 then
            set pFlushInstructionCache = GetModuleProcAddress( EXTRADLLNAME, "_FlushInstructionCache" )
        endif
        if pFlushInstructionCache != 0 then
            call CallStdcallWith2Args( pFlushInstructionCache, a, size )
        endif
    endfunction

// Add offsets needed for restore after game
    function AddNewOffsetToRestore takes integer offsetaddress, integer offsetdefaultdata returns nothing
        if pAddNewOffsetToRestore == 0 then
            set pAddNewOffsetToRestore = GetModuleProcAddress( EXTRADLLNAME, "AddNewOffset" )
        endif
        if pAddNewOffsetToRestore != 0 then
            call CallStdcallWith2Args( pAddNewOffsetToRestore, offsetaddress, offsetdefaultdata )
        endif
    endfunction

    function ChangeOffsetProtection takes integer pRealOffset, integer memSize, integer pProtectFlag returns integer
        local integer a
        local integer nIndex = 0
	
        if pVirtualProtect == 0 then
            set pVirtualProtect = GetModuleProcAddress( "Kernel32.dll", "VirtualProtect" )
        endif
        if pVirtualProtect != 0 then
            call AddNewOffsetToRestore( pRealOffset, RMem( pRealOffset ) )
            if memSize > 4 then
                set nIndex = memSize / 4 - 1
                set a = pRealOffset
                loop
                    exitwhen nIndex < 1
                    set a = a + 4
                    call AddNewOffsetToRestore( a, RMem( a ) )
                    set nIndex = nIndex - 1
                endloop
            endif
            call CallStdcallWith4Args( pVirtualProtect, pRealOffset, memSize, pProtectFlag, pReserverdIntArg1 )
            call FlushInstructionCache( pRealOffset, memSize )
            return RMem( pReserverdIntArg1 )
        endif

        return 0
    endfunction

    function ReadEAX takes nothing returns integer
        return ReadSomeRegisterOffset( REGISTER_EAX, 0 )
    endfunction

    function ReadEBX takes nothing returns integer
        return ReadSomeRegisterOffset( REGISTER_EBX, 0 )
    endfunction

    function ReadECX takes nothing returns integer
        return ReadSomeRegisterOffset( REGISTER_ECX, 0 )
    endfunction

    function ReadEDX takes nothing returns integer
        return ReadSomeRegisterOffset( REGISTER_EDX, 0 )
    endfunction

    function ReadESI takes nothing returns integer
        return ReadSomeRegisterOffset( REGISTER_ESI, 0 )
    endfunction

    function ReadEDI takes nothing returns integer
        return ReadSomeRegisterOffset( REGISTER_EDI, 0 )
    endfunction

    function ReadEBP takes nothing returns integer
        return ReadSomeRegisterOffset( REGISTER_EBP, 0 )
    endfunction

    function ReadESP takes nothing returns integer
        return ReadSomeRegisterOffset( REGISTER_ESP, 0 )
    endfunction

    function ReadEAX_offset takes integer offset returns integer
        return ReadSomeRegisterOffset( REGISTER_EAX, offset )
    endfunction

    function ReadEBX_offset takes integer offset returns integer
        return ReadSomeRegisterOffset( REGISTER_EBX, offset )
    endfunction

    function ReadECX_offset takes integer offset returns integer
        return ReadSomeRegisterOffset( REGISTER_ECX, offset )
    endfunction

    function ReadEDX_offset takes integer offset returns integer
        return ReadSomeRegisterOffset( REGISTER_EDX, offset )
    endfunction

    function ReadESI_offset takes integer offset returns integer
        return ReadSomeRegisterOffset( REGISTER_ESI, offset )
    endfunction

    function ReadEDI_offset takes integer offset returns integer
        return ReadSomeRegisterOffset( REGISTER_EDI, offset )
    endfunction

    function ReadEBP_offset takes integer offset returns integer
        return ReadSomeRegisterOffset( REGISTER_EBP, offset )
    endfunction

    function ReadESP_offset takes integer offset returns integer
        return ReadSomeRegisterOffset( REGISTER_ESP, offset )
    endfunction
    
    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
        local integer offset = RMem( RMem( pDamageEspData ) + 0x8 )
        local integer IsMelee = 0x100
        local integer d
  
  
        if DamageIncrementer > 8000 then
            set DamageIncrementer = 10
        endif
        //call TestMissileHandlerWorker( )

        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( I2S( DamageAttackTypes[DamageIncrementer] ) + " - тип аттаки" )
    
        set d = DamageDamageTypes[DamageIncrementer]
    
        call BJDebugMsg( I2S( d ) + " - тип урона" )
    
    
    
  //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
// 
        set IsMelee = RMem( RMem( RMem( pDamageEspData ) + 0x8 ) + 0xC )
        if IsMelee == 0x100 then
            call BJDebugMsg( "is melle = true" )
        endif
    
        if IsMelee == 0x101 then
            call BJDebugMsg( "is ranged = true" )
        endif
    
        if IsMelee != 0x100 and IsMelee != 0x101 then
            call BJDebugMsg( "is melle = false and is ranged false" )
        endif
    
  //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
 
  
    
endlibrary
Вот самый минимум функций, ну кое какие мои функций.
Принятый ответ
21
quq_CCCP, лол, у меня это и было. не знал что это минимум) можно закрывать, это я создавл вопрос из другого ака, где забыл пароль
Чтобы оставить комментарий, пожалуйста, войдите на сайт.