Нужно узнать удален ли юнит или нет.
Если занести юнита в переменную unit, а затем его удалить и запросить имя юнита, который хранится в переменной unit, то выведет "(null)".
Но если сравнить unit == null, то вернет false, также GetUnitName(unit) == "(null)" тоже false.
Как узнать, удалён юнит или нет?

почему тогда GetUnitName(unit) == "(null)" возвращает false, если в игре выводится (null)
Потому что проверяете на строку, а не на null
if GetUnitName(udg_unit) == null { BJDebugMsg("Удалён") }
else { BJDebugMsg("Не удалён") }
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
Похожие вопросы:

ответ
Главный кошмар тут, конечно - 14 групп. Пришлось так делать, т. к. принципиально не хочу применять глобалки, а локалки, похоже, после дестройгруп заново не юзабельны.
Это вроде должно быть легко поправить, вместо
call DestroyGroup (firewayunits1)
везде ставь
call GroupClear(firewayunits1)
и в самом конце уже, где идет обнуление переменных, там оставляешь DestroyGroup.
И с чего такая нелюбовь к глобалкам? Хештаблица используется, а это ж тоже глобалка, причем даже не просто глобалка, а супер-глобалка. У меня с ней постоянно головная боль была, из-за возникающих после интенсивной работы странных глюков...
ответ
Сначала проходит событие, срабатывает триггер, и выполняется код. И только после этого наносится урон. Чтобы обойти это, можно добавить паузу или таймером.
ответ
А что тут vJass требует? Глобалки?
Блок глобалок, что я объявил, и многострочные комментарии /*...*/.
PT153:
Переписал код, оставил кое-какие комментарии.
xD, я просто скопипастил создание эффекта, а ведь нужно было убрать под таймером GetSpellTargetUnit().
Вот так верно будет.
раскрыть
globals
    constant string Effect_A000 = "Abilities\\Spells\\Orc\\LightningBolt\\LightningBoltMissile.mdx"
    constant string AttEffect_A000 = "origin"
endglobals

function spell1_dmg takes nothing returns nothing
    local integer h = GetHandleId(GetExpiredTimer())
    local unit target = LoadInteger(udg_spells_hashtable, h, 0)
    local integer tik_count = LoadInteger(udg_spells_hashtable, h, 2)
    // Вместо определения локалки для кастера, сразу пихаем его в UnitDamageTargetBJ.
    // Локалку всё также можно определить, но после endif её нужно обнулить.
    // set caster = null
    call DestroyEffect(LoadEffectHandle(udg_spells_hashtable, h, 3))
    if tik_count > 0 then
        call UnitDamageTargetBJ(LoadUnitHandle(udg_spells_hashtable, h, 1),/*
                                              */ target, udg_spell1_dmg_period_count, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC)
        call DisplayTextToPlayer(GetLocalPlayer(), 0., 0., I2S(tik_count))  // асинхронно, работает по сети.
        call SaveInteger(udg_spells_hashtable, h, 2, tik_count - 1)
        call SaveEffectHandle(udg_spells_hashtable, h, 3, AddSpecialEffectTarget(Effect_A000, target, AttEffect_A000))
    else
        call FlushChildHashtable(udg_spells_hashtable, h)  // удаляет все записи с parent ключом h.
        call DestroyTimer(GetExpiredTimer())  // удаляет таймер.
    endif
    set target = null
endfunction

function Trig_spell1_cast_jass_Actions takes nothing returns nothing
    local timer t = CreateTimer()
    local integer h = GetHandleId(t)
    call TimerStart(t, 0.05, true, function spell1_dmg)
    call SaveUnitHandle(udg_spells_hashtable, h, 0, GetSpellTargetUnit())
    call SaveUnitHandle(udg_spells_hashtable, h, 1, GetSpellAbilityUnit())
    call SaveInteger(udg_spells_hashtable, h, 2, udg_spell1_time_period_count)
    call SaveEffectHandle(udg_spells_hashtable, h, 3, AddSpecialEffectTarget(Effect_A000, GetSpellTargetUnit(), AttEffect_A000))
    set t = null  // обнуление.
endfunction
ответ
Steal nerves:
зацикленность.
У тебя триггер ловит нанесение урона, затем этому же юниту наносим триггерно урон. Триггер сам себя и зацикливает. Так он будет бесконечно ловить и наносить урон. Это надо либо прервать или заранее исключить такое.
Заранее исключаем:
Выключаем тек триггер <= чтобы не словил нанесения урона
триггерно наносим урона
включаем обратно тек триггер

20
Вот, можете посмотреть. Удалить юнита ESC.
Загруженные файлы
30
Игра не сразу удаляет юнита, например:
globals
    unit UNIT
endglobals

function Trig_vd_Actions takes nothing returns nothing
    UNIT = gg_unit_ehpr_0057
    call RemoveUnit(UNIT)
    call BJDebugMsg(I2S(GetHandleId(UNIT))) // Вернёт корректный хэндл
endfunction

function InitTrig_vd takes nothing returns nothing
    set gg_trg_vd = CreateTrigger(  )
    call TriggerAddAction( gg_trg_vd, function Trig_vd_Actions )
endfunction
20
NazarPunk, хорошая инфа, но она не помогает, я проверяю каждые секунду в примере и приравниваю к null, все равно всегда возращает false.
Вот пример.
Загруженные файлы
22
а вы понимаете что такое null? А потом подумай 2 раза и вас осенят!
все хендлы всегда будет жить если его ссылает из любой перемменой!
20
pro100master, почему тогда GetUnitName(unit) == "(null)" возвращает false, если в игре выводится (null)
30
почему тогда GetUnitName(unit) == "(null)" возвращает false, если в игре выводится (null)
Потому что проверяете на строку, а не на null
if GetUnitName(udg_unit) == null { BJDebugMsg("Удалён") }
else { BJDebugMsg("Не удалён") }
Принятый ответ
20
NazarPunk, спасибо, а есть вариант побыстрее, слышал, что строки грузят сильно.
30
а есть вариант побыстрее
Обнуляйте глобалки вручную, и проблемы не будет.
20
Мне нужно узнать, был ли удалён юнит в процессе игры и очищать его из массива переменных. Это для наработки, поэтому будет проще, если сама нароботка будет очищать удалённых юнитов.
30
Это для наработки, поэтому будет проще, если сама нароботка будет очищать удалённых юнитов.
Используйте событие EVENT_UNIT_DECAY и удаляйте юнита из наработки.
20
NazarPunk, если юнит удаляется, то это событие срабатывает?
28
а есть вариант побыстрее, слышал, что строки грузят сильно.
Конечно.
function UnitExists takes unit u returns boolean
    return GetUnitTypeId(u) != 0
endfunction

function UnitDoesNotExist takes unit u returns boolean
    return GetUnitTypeId(u) == 0
endfunction
32
PT153, ну еще на мемхаке, попытатся найти адресс юнита...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.