Какие бывают причины фатал еррора? Схватил фатал еррор. Теперь нужно узнать из-за чего она.
Знаю что:
  1. Юнит не должен выйти за пределы карты
  2. Индекс игрока не должен быть отрицательным числом.
Какие еще есть причины словить фатал еррор? Добавьте свои списки причин

ESI=0CFB7EAC
В краш репорте засветился указатель на способность. В .dmp файле сохранена память стека потоков и еще некоторые регионы памяти. Среди них оказалась и область со способностью, в которой виден её равкод: 0x41304F4A или A0OJ. Эта способность основана на Aave (CAbilityAvengerForm).
Также видно равкод владельца — Hmgd.
Что на счет события — во время моих тестов оно срабатывало в начале и в конце перевополощения.
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
13
  1. Утечки 2. Скрытые кнопки 3.Поломанная модель(но тут не помню краш или вылет) 4.Деформация земли (сюда же относится способность топот горного короля) 5. Молнии могут крашить при неправильном использовании 6.Мемхак 7. Действия с мертвыми (ауры и т.д) 8. xgm.guru/p/wc3/Fatalnaya-oshibka-u-artilerii-XUc 9. Функции с установкой высоты по Z 10. Превращение юнитов в героев и обратно
возможно еще есть
Загруженные файлы
7
SoulRazor, А скрытие кнопки парулировать (0, -11) может крашануть?
7
Нашел такую прогу Jass View
Она позволяет увидеть последний триггер перед фаталом я так понял?
19
Так что в итоге показала программа? В момент краша исполнялся какой-то скрипт?
Еще, если бы ты выложил файл с краш-репортом, то было бы больше шансов понять причину.
По скриншоту понятно лишь то, что крашнулось в методе CAgent::GetParent.
Загруженные файлы
7
IceFog, вот вот, не могу теперь поймать этот фатал. Он возник случайно и насторожил меня)
Создал пустую карту и пытаюсь сымитировать фатал пробуя разные варианты, работает только вылет юнита за пределы карты и отрицательный индекс игрока. Но вот на готове сижу, если на своей карте возникнет фатал, то сразу запущу прогу.
Краш-репорт - это .dmp файл?
19
Была вызвана следующая цепочка методов:
CAbilityMorph::OnEvent
CAbilityMorph::FinishMorphing
CAbility::EnableOrders
CAbility::ShowUI
CAgent::GetParent
При попытке получить владельца некой способности превращения был получен краш из-за нулевого указателя.
Странно что, судя по моим наблюдениями, содержащее владельца поле CAbility::m_owner_unit не было nullptr. Краш произошел при попытке обратиться к вышестоящему агенту через другой способ, который требует наличия сетевого ID у объекта. Возможно, способность уже была убита, но кто-то всё равно вызвал её обработчик событий.
19
Принятый ответ
ESI=0CFB7EAC
В краш репорте засветился указатель на способность. В .dmp файле сохранена память стека потоков и еще некоторые регионы памяти. Среди них оказалась и область со способностью, в которой виден её равкод: 0x41304F4A или A0OJ. Эта способность основана на Aave (CAbilityAvengerForm).
Также видно равкод владельца — Hmgd.
Что на счет события — во время моих тестов оно срабатывало в начале и в конце перевополощения.
Загруженные файлы
16
IceFog, и вот ты еще одного кодера выручил, выяснив, какая именно абилка вызывает фатал. На самом деле большое тебе спасибо, я до сих пор помню и благодарен, как ты мне помог с моим параличом у кастомного героя.
7
В общем, у меня походу не явный фатал, иногда срабатывает, а иногда нет. Подозреваю что это обращение к обнуленному юниту.
32
Вручение 'ANeg' и её клона не героям, абилка попытается настроить иконки для изучения но не найдет их, так как она тупо идет по смещению Адресс юнита + оффсет, по которому лежит 'Aher' способность героя (красный плюс), поэтому её нельзя вручать не героям (да близарды редиски), аналогично ведут себя книги на увеличение характеристик героя, игра падает с фаталом. Обычные предметы на + к статам, проверяют является ли владелец героем.
7
A0OJ - эта абилка пустышка, внутри которой вручается руна, которая содержит способность морфа на основе Aave (Сфинкс). В общем наземный герой превращается в летающего.
ChatGPT пишет что после передачи руны герою, не стоит с героем делать действия, так как в этот момент идет пересборка героя. Например, не менять ману герою:
call UnitAddItem(caster, it) //Даем руну-пустышку
call SetUnitState(caster, UNIT_STATE_MANA, mana) //Корректируем ману
Возможно из-за этого идет фатал, не знаю.
Старый код
//Эта функция чтобы определить какую руну дать в зависимости кто кастанул Дейдара или Какаси?
function WhoseItemDeidaraOrKakasi takes unit u returns integer
    local integer unitTypeId = GetUnitTypeId(u)

    //1) D E I D A R A
    if unitTypeId == HERO_DEIDARA then
        return 'I03B'   //Deidara Up
        
    //2) D E I D A R A    F L Y
    elseif unitTypeId == HERO_DEIDARA_FLY then
        return 'I03C'   //Deidara Down
        
    //3) K A K A S H I
    elseif unitTypeId == HERO_KAKASHI then
        return 'I001'   //Kakasi Up
        
    //4) K A K A S H I   F L Y
    elseif unitTypeId == HERO_KAKASHI_FLY then
        return 'I003'   //Kakasi Down
    endif
    
    return 0
endfunction



function Fly_Timer takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer id = GetHandleId(t)
    local unit caster = LoadUnitHandle(Hash, id, 1)
    local real count = LoadReal(Hash, id, 303) + 0.25
    local item it
    local real mana = 0
    local integer c = LoadInteger(Hash, id, 999)    //Отсчет над головой врага. Равен длительностью морфа
    local texttag tt = LoadTextTagHandle(Hash, id, 1111)
    local real life = GetWidgetLife(caster)
    
    
    //Время морфа не истекло, мы живы и мы не запаузены перед дуэлью
    if c > 0 and life > 0.405 and not IsUnitPaused(caster) then
    
        if count == 1 then
            set count = 0
            set c = c - 1
            call SetTextTagVisibility(tt, true)
            call SetTextTagPosUnit(tt, caster, 75)
            call SetTextTagText(tt, I2S(c), (0.023))
        elseif count == 0.75 then
            call SetTextTagVisibility(tt, false)
        endif
        
        call SaveReal(Hash, id, 303, count)
        call SaveInteger(Hash, id, 999, c)
                
    //Мы мертвы, значит длительность морфа обнуляем. Дальше смотрим ниже, следующее условие...
    elseif life < 0.405 then
        set c = 0 //Чтобы вернуть в наземное состояние
        call SaveInteger(Hash, id, 999, c)
        call SetTextTagVisibility(tt, false)
    //Длительность морфа истек или мы только что возродились после смерти
    elseif c <= 0 and life > 0.405 then
        call DestroyTextTag(tt)
        set mana = GetUnitState(caster, UNIT_STATE_MANA)
        set it = CreateItem(WhoseItemDeidaraOrKakasi(caster), GetUnitX(caster), GetUnitY(caster))
        call UnitAddItem(caster, it)
        call RemoveItem(it)
        call SetUnitState(caster, UNIT_STATE_MANA, mana)
        call RemoveSavedHandle(Hash, GetHandleId(caster), StringHash("FlyTimer"))
        call PauseTimer(t)
        call DestroyTimer(t)
        call FlushChildHashtable(Hash, id)
    endif
    
    set t = null
    set caster = null
    set it = null
    set tt = null
endfunction



function Fly_Actions takes nothing returns nothing
    local unit caster = GetTriggerUnit()
    local timer t = CreateTimer()
    local integer id = GetHandleId(t)
    local item it
    local real mana = GetUnitState(caster, UNIT_STATE_MANA) //Чтобы нормализовать ману
    local integer c = R2I(GetUnitState(caster, UNIT_STATE_MAX_MANA) / 50) //Отсчет над головой врага. Он равен длительности способности
    local timer tempT
    local texttag tt = TextTagPermanent(I2S(c), caster, 75, 10, 0, 100, 60, 0, true, false)


    
    //=========Если использовать морф еще раз, поверх первой=========//
    set tempT = LoadTimerHandle(Hash, GetHandleId(caster), StringHash("FlyTimer"))
    if tempT != null then
        set id = GetHandleId(tempT)
        set caster = LoadUnitHandle(Hash, id, 1)
        set mana = GetUnitState(caster, UNIT_STATE_MANA)
        call SetUnitState(caster, UNIT_STATE_MANA, mana)
        set it = CreateItem(WhoseItemDeidaraOrKakasi(caster), GetUnitX(caster), GetUnitY(caster))
        call UnitAddItem(caster, it)
        call RemoveItem(it)
        call DestroyTextTag(LoadTextTagHandle(Hash, id, 1111))
        call RemoveSavedHandle(Hash, GetHandleId(caster), StringHash("FlyTimer"))
        call FlushChildHashtable(Hash, id)
        call PauseTimer(tempT)
        call DestroyTimer(tempT)
        set tempT = null
        set id = GetHandleId(t)
        set caster = GetTriggerUnit()
    endif
    //=====================//
    
    
    set it = CreateItem(WhoseItemDeidaraOrKakasi(caster), GetUnitX(caster), GetUnitY(caster)) //Руна-пустышка с морфом внутри
    call UnitAddItem(caster, it) //Даем руну-пустышку Дейдаре
    call RemoveItem(it) //Против утечек
    call SetUnitState(caster, UNIT_STATE_MANA, mana) //Корректируем ману
    call SaveTimerHandle(Hash, GetHandleId(caster), StringHash("FlyTimer"), t)
    call SaveUnitHandle(Hash, id, 1, caster)
    call SaveInteger(Hash, id, 999, c)
    call SaveTextTagHandle(Hash, id, 1111, tt)
    call TimerStart(t, 0.25, true, function Fly_Timer)
    
    set caster = null
    set t = null
    set it = null
    set tt = null
endfunction



function Fly_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == ABIL_FLY
endfunction



function InitTrig_Fly takes nothing returns nothing
    set gg_trg_Fly = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(gg_trg_Fly, EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(gg_trg_Fly, Condition(function Fly_Conditions))
    call TriggerAddAction(gg_trg_Fly, function Fly_Actions)
endfunction

32
Мб настройки морфа не верные?

Оно там еще делает перманентным или нет. Можешь попробовать морф медведя, в настройках морфа указываешь нормальную форму героя - которую хочешь получить (летающий), а альтернативную героя - которая у него по дефолту. Вручаешь и тут же удаляешь морф, герой превратится в летуна. Опять же проверять на смерть, перед врученим UnitAlive.
7
quq_CCCP, посмотрел, перепутал оказывается флаги.
Для превращения из наземного в летающего, стояли: Непрерываемый, Немедленное приземление, Немедленный взлет.
Для обратного превращения из летающего в наземное: Непрерываемый, Немедленное приземление, Немедленный взлет, Постоянные.
А должно быть наоборот.
7
Вручаешь и тут же удаляешь морф
Кстати "удаляешь морф" имеется ввиду удалить руну во избежание утечек. Или удалить бафф морфа?
7
quq_CCCP, Интересно, из-за чего может быть фатал?
Через 30-60 сек игра вылетает.
Загруженные файлы
32
Joma, ты удаляешь героя. Наверное бага движка, многие абилки имеют скрыте баффы которые следят за юнитом, к примеру Apos possesion тоже фаталит, если каст отменить и кастер умрет и разложится.
7
И снова фатал:

Интересно, а могут ли быть фаталы при использовании дефолтных скилов (не канал). Просто взять дефолтные скилы варика (как героиских, так и не героиских), сделать из них пустышку и дать герою. Просто не хочу засорять редактор обьектов и не создавать канальные способности.
Например вот так:
Открыть
19
Такой же краш как и прежде, но теперь проблема со способностью A0OK:Aave у юнита с типом Hmgd.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.