Решил использовать данную функцию:
function ShowAbility takes ability a, boolean flag returns nothing
Но если вводить туда айди способности, не проканает. Так вот, как мне спрятать способность, используя эту функцию? Если нужно вводить туда хэндл абилки, то как его узнать?
Узнал я о функции I2A, подставил её, запустил карту, и в момент когда абилка должна скрываться, ВЫЛЕТАЕТ ФАТАЛКА :)

LastUchiha, да, GetUnitAbility для получения адреса pAbil, и всё. Адресс всю игру у одного юнита будет один и тот же, поэтому адресс абилки можно сохранять в хештаблицу к примеру.
`
LOADING AD...
27
В рефе есть такие функции
---@param whichItem item
---@param index integer
---@return ability
function BlzGetItemAbilityByIndex(whichItem, index) end	-- (native)

---@param whichItem item
---@param abilCode integer
---@return ability
function BlzGetItemAbility(whichItem, abilCode) end	-- (native)

---@param whichUnit unit
---@param abilId integer
---@return ability
function BlzGetUnitAbility(whichUnit, abilId) end	-- (native)

---@param whichUnit unit
---@param index integer
---@return ability
function BlzGetUnitAbilityByIndex(whichUnit, index) end	-- (native)

А с помощью BlzGetAbilityId(whichAbility) можно знать ид

Из моей работы ранее я забил вручную бд абилок для итемов, тк невозможно было получить ид. в новом патче 1.33 завезли нативку BlzGetAbilityId для ниже перечисленных, которые могут список крутить. однако, оно выдает ability. Как раз BlzGetAbilityId конвентирует ability в id

Я знаю, что вам могут нативки из рефа не подойти, но попробуйте найти что-то то похожее в japi unryze. Реф немного ограничен в этом плане. Это я показал пример, где это можно было применить.
Для вашей работы достаточно:
set ab = BlzGetUnitAbility(whichUnit, abilId)
call ShowAbility(ab, true)
32
Снова схватил что попало не глядя, тебе нужен указатель на абилку - это integer, в мемхаке есть функция GetUnitAbility( unit, integer id) returns integer
Обязательно проверять на наличиее абилки и чему равен указатель, если он меньше 1 то абилки у юнита нету.

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 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
Все просто, находишь у юнита указатель на абилку, если он не равен нулю, то записываешь в адрес абилки +0x40 значение, любое выше 0 это абилка скрыта, это счетчик.
Внимательно смотри на список функций, там наделаны на все случаи жизни, выбирай не первую попавшуюся.
Replies (5)
8
quq_CCCP, А что если таких функций нету в том мемхаке что ты мне кидал?)
32
LastUchiha, есть, не так выглядят, там есть для абилки и для адреса, тебе нужны для адреса.
8
quq_CCCP, Это вот эти?
    function SetAddressAbilityHidden takes integer pAbil, integer count returns nothing
        if pAbil > 0 then
            call WriteRealMemory( pAbil + 0x40, count )
        endif
    endfunction

    function AddAddressAbilityHidden takes integer pAbil, integer d returns nothing
        call WriteRealMemory( pAbil + 0x40, ReadRealMemory( pAbil + 0x40 ) + d )
    endfunction

    function ShowAddressAbility takes integer pAbil, boolean flag returns nothing
        if pAbil > 0 then
            if ReadRealMemory( pAbil ) > 0 then
                call WriteRealMemory( pAbil + 0x40, B2I( not flag ) )
            endif
        endif
    endfunction
32
LastUchiha, да, GetUnitAbility для получения адреса pAbil, и всё. Адресс всю игру у одного юнита будет один и тот же, поэтому адресс абилки можно сохранять в хештаблицу к примеру.
Accepted answer
8
quq_CCCP, То есть если сделать так --> ShowAddressAbility( GetUnitAbility( n, n, n ), false ), то оно заработает?
To leave a comment please sign in to the site.