Добавлен ClotPh
ППЦ, НЕРВЫ УЖЕ ВООБЩЕ НИКУДА...
Рядом бушует герой с такими спеллами.
Это какой-то один из этих трех спеллов, ульта еще у героя есть, но она не была изучена на момент фатала.
Скорее всего проблемы со StartAbilityCooldown, но что может быть не так? Она запускает только спелл на основе инфернала дредлорда.
function AestheticsRefresh takes nothing returns nothing
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, p, Aestheticsunits1
local timer t = GetExpiredTimer()
local unit u5=LoadUnitHandle(udg_Hash,GetHandleId(t),2)
local unit u6
local location p = GetUnitLoc(u5)
local group Aestheticsunits1 = CreateGroup()
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
local integer numberofbuildings = 0
local real addmanalife = 3 * GetUnitAbilityLevelSwapped('A320',u5)
//Если героя нет, то разрушить таймер, чтобы не крутился и не жрал ресурсы.
if (u5 == null) then
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))
else
set Aestheticsunits1 = GetUnitsInRangeOfLocAll(900.00, p)
loop
set u6=FirstOfGroup(Aestheticsunits1)
exitwhen u6==null
call GroupRemoveUnit(Aestheticsunits1,u6)
if ( ( IsUnitType((u6), UNIT_TYPE_ANCIENT) == true ) and (IsDead(u6) == false)) then
set numberofbuildings = numberofbuildings + 1
else
endif
endloop
//ЕСЛИ НАШЛИ ХОТЬ ОДНО ЗДАНИЕ - ДОБАВЛЯЕМ МАНУ И ХП
if (numberofbuildings > 0) then
call DestroyEffect(AddSpecialEffectTarget("Sculptor3.mdx",u5,"chest"))
call SetUnitState(u5, UNIT_STATE_LIFE, GetUnitState(u5, UNIT_STATE_LIFE) + addmanalife)
call SetUnitState(u5, UNIT_STATE_MANA, GetUnitState(u5, UNIT_STATE_MANA) + addmanalife)
endif
//ЕСЛИ НАШЛИ ХОТЬ ОДНО ЗДАНИЕ - ДОБАВЛЯЕМ МАНУ И ХП - ЗАКРЫТО.
endif
call DestroyGroup (Aestheticsunits1)
call RemoveLocation (p)
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, p, Aestheticsunits1
set t = null
set u5 = null
set u6 = null
set p = null
set Aestheticsunits1 = null
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function Ornament2 takes nothing returns nothing
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6
local timer t= GetExpiredTimer()
local unit u5= LoadUnitHandle(udg_Hash,GetHandleId(t),2)
local unit u6= LoadUnitHandle(udg_Hash,GetHandleId(t),1)
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
local integer level = GetUnitAbilityLevelSwapped('A31Z',u5)
local real x = GetUnitX(u6)
local real y = GetUnitY(u6)
call SaveReal(udg_Hash,GetHandleId(u5),StringHash("ornamenthash"),0)
//ВОТ ТУТ ВСЕ ДЕЙСТВИЯ ПО СПЕЛЛУ - СПЕЛЛБУКИ БУДУТ ПРЕЛОАД Д. МАМКЕ И УДАЛЕНЫ С НЕЁ!!! !!! !!! !!! !!! !!!
//ЕСЛИ ПЕРВОГО НЕТ
if (GetUnitAbilityLevelSwapped ('A322', u6) == 0) and (GetUnitAbilityLevelSwapped ('A326', u6) == 0) then
if (IsUnitEnemy(u6,GetOwningPlayer(u5)) == true) then
//ДОБАВКА И ДИЗЕЙБЛ СПЕЛЛБУКОВ
call UnitAddAbility(u6,'A327')
call SetPlayerAbilityAvailableBJ( false, 'A327', GetOwningPlayer(u6) )
call UnitMakeAbilityPermanent(u6,true,'A327')
call UnitMakeAbilityPermanent(u6,true,'A326')
//ДОБАВКА И ДИЗЕЙБЛ СПЕЛЛБУКОВ - ЗАКРЫТО.
else
//ДОБАВКА И ДИЗЕЙБЛ СПЕЛЛБУКОВ
call UnitAddAbility(u6,'A323')
call SetPlayerAbilityAvailableBJ( false, 'A323', GetOwningPlayer(u6) )
call UnitMakeAbilityPermanent(u6,true,'A323')
call UnitMakeAbilityPermanent(u6,true,'A322')
//ДОБАВКА И ДИЗЕЙБЛ СПЕЛЛБУКОВ - ЗАКРЫТО.
call UnitRemoveAbility(u6,'A327')
call UnitRemoveAbility(u6,'A326')
endif
//ЕСЛИ ПЕРВОГО НЕТ - ЗАКРЫТО.
else
//ЕСЛИ ВТОРОГО НЕТ
if (GetUnitAbilityLevelSwapped ('A324', u6) == 0) and (GetUnitAbilityLevelSwapped ('A328', u6) == 0) then
if (IsUnitEnemy(u6,GetOwningPlayer(u5)) == true) then
//ДОБАВКА И ДИЗЕЙБЛ СПЕЛЛБУКОВ
call UnitAddAbility(u6,'A329')
call SetPlayerAbilityAvailableBJ( false, 'A329', GetOwningPlayer(u6) )
call UnitMakeAbilityPermanent(u6,true,'A329')
call UnitMakeAbilityPermanent(u6,true,'A328')
//ДОБАВКА И ДИЗЕЙБЛ СПЕЛЛБУКОВ - ЗАКРЫТО.
else
//ДОБАВКА И ДИЗЕЙБЛ СПЕЛЛБУКОВ
call UnitAddAbility(u6,'A325')
call SetPlayerAbilityAvailableBJ( false, 'A325', GetOwningPlayer(u6) )
call UnitMakeAbilityPermanent(u6,true,'A325')
call UnitMakeAbilityPermanent(u6,true,'A324')
//ДОБАВКА И ДИЗЕЙБЛ СПЕЛЛБУКОВ - ЗАКРЫТО.
call UnitRemoveAbility(u6,'A329')
call UnitRemoveAbility(u6,'A328')
endif
//ЕСЛИ ВТОРОГО НЕТ - ЗАКРЫТО.
else
//ТЕЛЕПОРТАЦИЯ
call DestroyEffect(AddSpecialEffectTarget("Sculptor23.mdx",u5,"origin"))
call DestroyEffect(AddSpecialEffectTarget("Sculptor23.mdx",u6,"origin"))
//Задание координат с проверкой на края карты.
if RectContainsCoords(bj_mapInitialPlayableArea,x,y) then
call SetUnitX (u5,x)
call SetUnitY (u6,y)
endif
//Задание координат c проверкой на края карты - закрыто.
//ТЕЛЕПОРТАЦИЯ - ЗАКРЫТО.
endif
endif
call SetUnitAbilityLevelSwapped( 'A322', u6, level )
call SetUnitAbilityLevelSwapped( 'A324', u6, level )
call SetUnitAbilityLevelSwapped( 'A326', u6, level )
call SetUnitAbilityLevelSwapped( 'A328', u6, level )
//ВОТ ТУТ ВСЕ ДЕЙСТВИЯ ПО СПЕЛЛУ - ЗАКРЫТО.
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash, GetHandleId(t))
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6
set t=null
set u5=null
set u6=null
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function Ornament takes nothing returns nothing
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6
local timer t= CreateTimer()
local unit u5= GetTriggerUnit()
local unit u6= GetSpellTargetUnit()
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
local integer i= 0
local real ornamenthash = 0
set ornamenthash = LoadReal(udg_Hash,GetHandleId(u5),StringHash("ornamenthash"))
if ( GetSpellAbilityId() == 'A31Z' ) and ornamenthash == 0 then
call PlaySoundOnUnitBJ( gg_snd_SculptorOrnament, 100, u6 )
call SaveReal(udg_Hash,GetHandleId(u5),StringHash("ornamenthash"),1)
call SaveUnitHandle(udg_Hash, GetHandleId(t), 2, u5)
call SaveUnitHandle(udg_Hash, GetHandleId(t), 1, u6)
call SaveInteger(udg_Hash, GetHandleId(t), 3, i)
call TimerStart(t, 0.01, true, function Ornament2)
else
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash, GetHandleId(t))
endif
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6
set t=null
set u5=null
set u6=null
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function GreatHammer takes nothing returns nothing
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, p, GreatHammerunits1
local timer t = GetExpiredTimer()
local unit u5=LoadUnitHandle(udg_Hash,GetHandleId(t),2)
local unit u6
local location p = GetUnitLoc(u5)
local group GreatHammerunits1 = CreateGroup()
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
//Если героя нет, то разрушить таймер, чтобы не крутился и не жрал ресурсы.
if (u5 == null) then
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))
else
//ЕСЛИ ЕСТЬ МОЛОТ, ТО "ПОДОБРАТЬ" И НАЧАТЬ КД 1, КСТАТИ, НОРМ ПРОВЕРКА НА НАЛИЧИЕ ОБЪЕКТА ПО ID РЯДОМ 1-СЕКУНДНЫМ ТАЙМЕРОМ
set GreatHammerunits1 = GetUnitsInRangeOfLocAll(200.00, p)
loop
set u6=FirstOfGroup(GreatHammerunits1)
exitwhen u6==null
call GroupRemoveUnit(GreatHammerunits1,u6)
if ( ( GetUnitTypeId(u6) == 'n402' ) and ( IsDead(u6) == false ) ) then
call RemoveUnit (u6)
call StartAbilityCooldown(u5,'A31Y',1)
else
endif
endloop
//ЕСЛИ ЕСТЬ МОЛОТ, ТО "ПОДОБРАТЬ" И НАЧАТЬ КД 1 - ЗАКРЫТО.
endif
call DestroyGroup (GreatHammerunits1)
call RemoveLocation (p)
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, p, GreatHammerunits1
set t = null
set u5 = null
set u6 = null
set p = null
set GreatHammerunits1 = null
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
Принятый ответ
function IsAbilityOnCooldown takes integer a returns boolean
return IsFlagBitSet(RMem(a+0x20),512)
endfunction
function StartAbilityCooldownFxByAddress takes integer pAbility, real cd returns boolean
if pAbility < 1 then
return false
endif
set Memory[pReserverdIntArg1 / 4] = mR2I(cd)
call CallThisCallWith2Args( RMem(RMem(pAbility)+0x3A4) , pAbility, pReserverdIntArg1 )//pStartAbilityCD
return IsAbilityOnCooldown( pAbility )
endfunction
function StartAbilityCooldownFx 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
return StartAbilityCooldownFxByAddress(GetUnitAbility(whichUnit, abilityId),cd)
endfunction
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
А вот функция стартабилитикулдаун, к-рой ща пользуюсь
local integer pAbility = 0
if whichUnit == null or GetUnitAbilityLevel( whichUnit, abilityId ) < 1 or cd == 0.00 then
return false
endif
set pAbility = GetUnitAbilityForAddresss( ConvertHandle( whichUnit ), abilityId )
if pAbility == 0 then
return false
else
set Memory[pReserverdIntArg1 / 4] = cleanInt( realToIndex( cd ) )
call CallThisCallWith2Args( pStartAbilityCD, pAbility, pReserverdIntArg1 )
return IsAbilityOnCooldown( pAbility )
endif
return false
endfunction
Отредактирован DracoL1ch
Эта функция вроде запускает только фактический кд абилки, а мне как раз нужно заданный мной
///////////
Так, ладно, функция импортнута, в тест-карте норм, но там и та функция и вообще весь герой были норм и не фаталили, и в игровой карте все спеллы юзались не раз без проблем, фатал в любом случае не всегда, надо тестить, ща в игровой потестирую, если будут выявлены дальше проблемы, напишу
Именно так, как написано выше
Мб потому, что многие функции еще с исходной версии мемхака, втч, ятп, те, которые использует эта функция
/////
Так, ну ВРОДЕ норм, большое спасибо, сообщения пролайканы.
Вопрос: а есть наиболее полная инфа по ситуациям/закономерностям, в которых вызывала фаталы "старая" StartAbilityCooldown? Можно в ЛС. Я к ним пока добавляю ситуацию, когда спелл на основе "огненного голема" дредлорда, находящийся на перезарядке, запускается на перезарядку.
Потому что она у меня используется пока у нескольких других героев и с ними проблем замечено не было.