Ловлю фатал, не знаю что делать... abilid и cd внутри корректные, pStartAbilityCD pReserverdIntArg1 ненулевые
function StartAbilityCD takes unit u, integer abilid returns nothing
local integer pAbility = GetUnitAbility(u,abilid)
local real cd = GetAbilityCD(abilid, GetPlayerId(GetOwningPlayer(u))+1)
call WMem(mR2I(cd), pReserverdIntArg1)
call CallThisCallWith2Args(pStartAbilityCD, pAbility, pReserverdIntArg1)
endfunction
Нужно для того, чтобы при использовании одного навыка, другой тоже начинал свою перезарядку
Вот второй вариант на основе SetAbilityCurrentCooldown, не фаталит (спс WMem), но и результата не дает
function StartAbilityCD takes unit u, integer id returns nothing
local integer a = GetUnitAbility(u,id)
local real seconds = GetAbilityCD(id, GetPlayerId(GetOwningPlayer(u))+1)
local integer pData = RMem( a + 0xDC )
if pData > 0 then
call WMem( pData + 4, mR2I( seconds + mI2R( RMem( pData + 4 ) ) ) )
endif
endfunction

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

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

set pAbility = GetUnitAbility(whichUnit, abilityId)
if pAbility < 1 then
return false
else
if RMem(pAbility+0x134)==-1 and RMem(pAbility+0x138)==-1 then
call WMem(pAbility+0x134,0)
call WMem(pAbility+0x138,0)
endif
set Memory[pReserverdIntArg1 / 4] = mR2I(cd)
call CallThisCallWith2Args( pStartAbilityCD, pAbility, pReserverdIntArg1 )
return IsAbilityOnCooldown( pAbility )
endif
return false
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
32
7 лет назад
0
Ооо, у меня нет слов, че за идиотия? Уже 100500 раз была разжевана эта функция, марш в тему про мемхак читать.
0
21
7 лет назад
0
От сссра вроде была рабочая функция, но по последним данным, ятп, и она фаталит как минимум на блинках.
Я пока ингейм в итоговых версиях не юзаю, только на тесткартах.
2
13
7 лет назад
2
Возможно "канал" так же имеет отличную от остальных абилок структуру
Рабочий вариант
function StartAbilityCD takes unit whichUnit, integer abilityId returns boolean
local integer pAbility = 0
local real cd = GetAbilityCD(abilityId, GetPlayerId(GetOwningPlayer(whichUnit))+1)
if whichUnit == null or GetUnitAbilityLevel( whichUnit, abilityId ) < 1 or cd == 0.00 then
return false
endif

set pAbility = GetUnitAbility(whichUnit, abilityId)
if pAbility < 1 then
return false
else
if RMem(pAbility+0x134)==-1 and RMem(pAbility+0x138)==-1 then
call WMem(pAbility+0x134,0)
call WMem(pAbility+0x138,0)
endif
set Memory[pReserverdIntArg1 / 4] = mR2I(cd)
call CallThisCallWith2Args( pStartAbilityCD, pAbility, pReserverdIntArg1 )
return IsAbilityOnCooldown( pAbility )
endif
return false
endfunction
Принятый ответ
0
32
7 лет назад
0
ClotPh, у блинка зачем то в структуре бывает ссылка для сайленса абилки, её нужно либо удалить - либо как то вызвать.
Там проверки на == -1, а нужно заменить на != 0
0
21
7 лет назад
0
Nelloy,
  1. За что твой пост минуснули?
  2. Фаталит ли твой вариант на цепных молниях и блинках?
Чтобы оставить комментарий, пожалуйста, войдите на сайт.