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