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

Принятый ответ

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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
2
19
5 лет назад
2
Похожие вопросы:

ответ
Главный кошмар тут, конечно - 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:
зацикленность.
У тебя триггер ловит нанесение урона, затем этому же юниту наносим триггерно урон. Триггер сам себя и зацикливает. Так он будет бесконечно ловить и наносить урон. Это надо либо прервать или заранее исключить такое.
Заранее исключаем:
Выключаем тек триггер <= чтобы не словил нанесения урона
триггерно наносим урона
включаем обратно тек триггер

0
25
5 лет назад
0
Чет мистика какая то. Все должно работать.
0
19
5 лет назад
0
Вот, можете посмотреть. Удалить юнита ESC.
Загруженные файлы
0
29
5 лет назад
0
Игра не сразу удаляет юнита, например:
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
0
19
5 лет назад
0
NazarPunk, хорошая инфа, но она не помогает, я проверяю каждые секунду в примере и приравниваю к null, все равно всегда возращает false.
Вот пример.
Загруженные файлы
0
23
5 лет назад
0
а вы понимаете что такое null? А потом подумай 2 раза и вас осенят!
все хендлы всегда будет жить если его ссылает из любой перемменой!
0
19
5 лет назад
0
pro100master, почему тогда GetUnitName(unit) == "(null)" возвращает false, если в игре выводится (null)
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.