Интересно, а могут ли быть фаталы при использовании дефолтных скилов (не канал). Просто взять дефолтные скилы варика (как героиских, так и не героиских), сделать из них пустышку и дать герою. Просто не хочу засорять редактор обьектов и не создавать канальные способности.
Например вот так:
A0OJ - эта абилка пустышка, внутри которой вручается руна, которая содержит способность морфа на основе Aave (Сфинкс). В общем наземный герой превращается в летающего.
ChatGPT пишет что после передачи руны герою, не стоит с героем делать действия, так как в этот момент идет пересборка героя. Например, не менять ману герою:
//Эта функция чтобы определить какую руну дать в зависимости кто кастанул Дейдара или Какаси?
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
IceFog, вот вот, не могу теперь поймать этот фатал. Он возник случайно и насторожил меня)
Создал пустую карту и пытаюсь сымитировать фатал пробуя разные варианты, работает только вылет юнита за пределы карты и отрицательный индекс игрока. Но вот на готове сижу, если на своей карте возникнет фатал, то сразу запущу прогу.
Краш-репорт - это .dmp файл?
Ageron, не согласен. У меня B требует A. С ничего не требует, но B также требует и C. Но я это не указал вот так:
library B requires A, C
а просто указал
library B requires A
Но оно все равно работало корректно, не ругался типа что библиотека C не обявлена.
Не указал по причине того что таких библиотек как C у меня много: C, C1, C2, C3, C4, ... C40.
Но я не могу указывать вот так:
LastUchiha, да, Naruto - Survival Arena все, последняя версия. Поддерживать карту трудно, редактор способностей слишком много, на 15 героев свыше 1000 абилок, все это открывается долго. Код кастыльный). Но зато получил опыт и знания делая эту карту)
» WarCraft 3 / у меня есть моделика распира барагана почему то когда игрок…
» WarCraft 3 / у меня есть моделика распира барагана почему то когда игрок…
» WarCraft 3 / Почему показать текст лагает?
» WarCraft 3 / Причины FATAL ERROR?
» WarCraft 3 / Причины FATAL ERROR?
» WarCraft 3 / Причины FATAL ERROR?
Через 30-60 сек игра вылетает.
» WarCraft 3 / Причины FATAL ERROR?
Ред. Joma
» WarCraft 3 / Причины FATAL ERROR?
https://xgm.guru/files/100/365447/comments/561956/2026-05-01_19....
https://xgm.guru/files/100/365447/comments/561956/CrashSummaries...
Например вот так:
-
image_copy1.png
Полный списокРед. Joma
» WarCraft 3 / Причины FATAL ERROR?
Ред. Joma
» WarCraft 3 / Причины FATAL ERROR?
Ред. Joma
» WarCraft 3 / Причины FATAL ERROR?
Создал пустую карту и пытаюсь сымитировать фатал пробуя разные варианты, работает только вылет юнита за пределы карты и отрицательный индекс игрока. Но вот на готове сижу, если на своей карте возникнет фатал, то сразу запущу прогу.
Краш-репорт - это .dmp файл?
https://xgm.guru/files/100/365447/comments/561900/2026-04-21_21....
Ред. Joma
» WarCraft 3 / Причины FATAL ERROR?
» WarCraft 3 / Причины FATAL ERROR?
Она позволяет увидеть последний триггер перед фаталом я так понял?
» WarCraft 3 / Зависимости библиотек
Ред. Joma
» WarCraft 3 / Зависимости библиотек
Не указал по причине того что таких библиотек как C у меня много: C, C1, C2, C3, C4, ... C40.
Но я не могу указывать вот так:
» WarCraft 3 / Как убрать кнопку "воскресить героя"?
» WarCraft 3 / Как отследить "время подготовки заклинания"?
Ред. Joma
» WarCraft 3 / Скорость поворота юнита
» WarCraft 3 / Скорость поворота юнита
» WarCraft 3 / Ошибка при сохранении карты
» WarCraft 3 / Ошибка при сохранении карты
Ред. Joma
» WarCraft 3 / Привет, у меня произошел фаталити еррор кто нибудь знает из за…
» WarCraft 3 / ThunderBolt Arena
» WarCraft 3 / Удаление спецэффекта
Ред. Joma
» WarCraft 3 / Удаление спецэффекта