Сабж по мемхаку, прошу ответов только от тех, кто рли разбирается.
Есть герой Психопомпа.
Из-за его способностей происходит следующее:
Каждый раз, когда любой герой кастует любой спелл и его перезарядка больше 1, перезарядка первой абилы Психопомпы приравнивается к перезарядке этой скастованной абилы, а манакост - к перезарядке этой абилы, умноженной x3/x4/x5/x6/x7 по лвлу прокачки.
Каждый раз, когда любой герой кастует любой спелл не-предмета и его перезарядка больше 1, Психопомпа ресает ману в 4 * уровень своей способности.
Каждый раз, когда любой герой кастует любой спелл не-предмета и его перезарядка больше 1, Психопомпа ресает здоровье в перезарядка скастованной способности * уровень этой своей способности.
Иногда (НЕ после каждой игры, но иногда) по выходу из вара (т. е. уже ПОСЛЕ игры, но все-таки) происходит фатал.
Есть предположения о причинах? Или это само по себе потому, что постоянно передрачивается перезарядка способности и ее манакост?
КСТАТИ. У абилы не 10 лвлов, а 5, это "предусмотрительный" ифзенэлс из другого триггера. Так что loop каждый раз пытается вписать по 5 манакостов и перезарядок в первом триггере на несуществующие уровни абилы. Мб в этом причина??? Но почему тогда фатал иногда есть, а иногда не? Ну это я в люб. случае исправлю потом, главное, не забыть (то есть вот в первой функции local integer i = 11 надо заменить на local integer i = 6). Но есть еще что-нибудь?
Коды ниже (триги, вызывающие эти функции, реагируют на каст любой абилы любым героем)
function MadBreathParametersChange takes nothing returns nothing
local integer i = 11
local real newcd = GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit()))
if (GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) >= 1) then
ЗАДАЕМ ПЕРЕЗАРЯДКУ И МАНАКОСТ БЕЗУМНОГО ДЫХАНИЯ, УРОН УЖЕ ОТ НИХ ПОТОМ
loop
exitwhen i < 1
set i = i-1
call SetAbilityCD ('A27Q', i, newcd)
call SetAbilityManaCost('A27Q',i,R2I(GetAbilityCD('A27Q',i) * (2 + i)))
endloop
ЗАДАЕМ ПЕРЕЗАРЯДКУ И МАНАКОСТ БЕЗУМНОГО ДЫХАНИЯ, УРОН УЖЕ ОТ НИХ ПОТОМ - ЗАКРЫТО.
else
endif
endfunction
function DelicacyEffect takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, herounits
local unit u5
local group herounits = GetUnitsInRectAll(GetPlayableMapRect())
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
if ( GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit()) >= 1 ) and (GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) >= 1) then
ИЩЕМ СРЕДИ ГЕРОЕВ ТЕХ, У КОГО ЕСТЬ ПАССИВКА И ДОБАВЛЯЕМ МАНУ
loop
set u5=FirstOfGroup(herounits)
exitwhen u5==null
call GroupRemoveUnit(herounits,u5)
if ( GetUnitAbilityLevelSwapped('A27S', u5) >= 1 ) then
call SetUnitState(u5, UNIT_STATE_MANA, GetUnitState(u5, UNIT_STATE_MANA) + 4 * GetUnitAbilityLevelSwapped('A27S',u5))
else
endif
endloop
ИЩЕМ СРЕДИ ГЕРОЕВ ТЕХ, У КОГО ЕСТЬ ПАССИВКА И ДОБАВЛЯЕМ МАНУ - ЗАКРЫТО.
else
endif
call DestroyGroup (herounits)
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, herounits
set u5 = null
set herounits = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function PerceptionEffect takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, herounits
local unit u5
local group herounits = GetUnitsInRectAll(GetPlayableMapRect())
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
if ( GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit()) >= 1 ) and (GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) >= 1) then
ИЩЕМ СРЕДИ ГЕРОЕВ ТЕХ, У КОГО ЕСТЬ ПАССИВКА И ДОБАВЛЯЕМ ЗДОРОВЬЕ
loop
set u5=FirstOfGroup(herounits)
exitwhen u5==null
call GroupRemoveUnit(herounits,u5)
if ( GetUnitAbilityLevelSwapped('A27T', u5) >= 1 ) then
call AddSpecialEffectTargetUnitBJ( "overhead", u5, "Psychopomp4.mdl" )
call ConditionalTriggerExecute( gg_trg_destroyspeceffect )
call SetUnitState(u5, UNIT_STATE_LIFE, GetUnitState(u5, UNIT_STATE_LIFE) + GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) * GetUnitAbilityLevelSwapped('A27T',u5))
else
endif
endloop
ИЩЕМ СРЕДИ ГЕРОЕВ ТЕХ, У КОГО ЕСТЬ ПАССИВКА И ДОБАВЛЯЕМ ЗДОРОВЬЕ - ЗАКРЫТО.
else
endif
call DestroyGroup (herounits)
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, herounits
set u5 = null
set herounits = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction

фатал после игры может быть вызван
а) использованием malloc
б) копированием внутриигровых структур (например, структуру сплеша перенес от одного юнита другому, при чистке один раз адрес зачистился, а на втором проходе произошел краш)
в) неизвестным мне образом
`
ОЖИДАНИЕ РЕКЛАМЫ...
16
а на 5й уровень всё корректно работает? ну т.е. измегнения проходят?
если на выходе фатал, где-то память нечищенная осталась. я вообще б не советовал юзать malloc без ооооччень крайней необходимости
21
Все изменения проходят, это не раз проверялось, я же за героя играю и вижу, что с абилкой происходит, и уж на 5 уровне, т. к. он максимальный, это виднее всего.
А почему именно на 5 должно не проходить? В текущем же варианте вообще оно циклит даже лишние несуществующие уровни сверх пятого (что и думаю убрать как ошибку).
Просто на выходе из вара после игры за Психопомпу иногда происходит фатал. Вроде бы чаще НЕ происходит, чем происходит, но тем не менее.
А тут-то где malloc, я же НЕ клонирую абилки, или он применяется в гитхабовских функциях на смены кд и манакоста? Наизусть не помню...
Этот комментарий удален
21
UPD! Только что было 2 игры. После одной после выхода из игры фатал был, после второй нет, вторая закончилась гораздо быстрее и в ней только на последних минутах успел прокачаться и потриггериться ульт (последняя функция, отхил).
Такие предположения: или дело действительно в том, что что-то по многу раз за большее число времени избыточно перезаписывается; или, может, дело вообще не в коде, а спецэффект ульта косой и может вар фаталить (модели, фаталящие вар ИНОГДА, существуют, факт, даже тут для закачки таких пара есть).
Ну он так-то в любом случае немного косой, т. к. не имеет анимы Death и его приходится рушить через функцию с таймером (см. код), что снижает производительность при масс кастах (незначительно, но всё-таки).
Короче, пока выводы делаю следующие:
  • сменю local integer i = 11 на = 6
  • сменю эффект ульта на вообще другой
Хуже и от того и от другого точно не будет (если эффект более красивый подберу).
Потом посмотрю, как будет, если есть еще идеи - пишите.
21
Так, ну короче:
  • эффект не при чем (поменялся на совершенно другой - ничего не изменилось, да и все-таки фаталящие вар ИНОГДА эффекты его если ИНОГДА фаталят, то СРАЗУ, а не при выходе из игры).
  • i = 11 на i = 6 изменено, так правильнее, конечно, но в смысле фатала тоже ничего не изменилось.
А может быть фатал ПОСЛЕ игры из-за утечек? Типа память позабивалась. Есть кое-какие подозрения...
16
фатал после игры может быть вызван
а) использованием malloc
б) копированием внутриигровых структур (например, структуру сплеша перенес от одного юнита другому, при чистке один раз адрес зачистился, а на втором проходе произошел краш)
в) неизвестным мне образом
Принятый ответ
21
DracoL1ch, уже второй раз упоминаешь malloc, он у меня выше где-то используется?
Думаю, может, там в ульте вначале отдельно считать перезарядку абилы как реалку, а уже потом плюсовать здоровье? Потому что 90% уверенности, что это ульта шалит...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.