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

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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
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.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.