Точное название функций мог перепутать) Суть проблемы такая есть абила свыбором цели которая кастуется на область и ресает случайного героя. В этой области при помощи GetUnitsInRange ( условие которая принимает функция чуть ниже ) я добовляю в группу откуда потом беру случайного героя. Но группа остается пустой. Способность воскрешает героя только во время анимации его смерти а если он уже так сказать полежал то условие не видит его.
Есть какой-нибудь способ все таки ловить мертвых героев или что я делаю не так помоги пожалуйста.
Условие.
p.s: за синтаксис не ручаюсь так как писал в посте а не копировал с мапы
function SoulLantern takes nothing returns boolean
	return ( IsUnitType ( GetFilterUnit (), UNIT_TYPE_HERO ) and  IsUnitType ( GetFilterUnit (), UNIT_TYPE_DEAD )  )
endfunction

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

Ну как сказать, юнит является юнитом секунды 3 после смети (или сколько там установлено время смерти), потом его уже нету на карте, поэтому можно и не искать, но герои сидят в памяти пока их не удалят, в отличии от обычных юнитов, но всеравно их уже не существует в понимании движка на уровне бегающих и дерущихся юнитов.

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
12
7 лет назад
0
EnergyFrost:
Ты как его воскрешаешь? Черещ Revive? Может быть он после смерти меняет координаты на другие. Если группа пуста, значит какое-то условие кривое и скорее всего второе. Попробуй проверять хп <=0.
Как вариант на крайняк. При смерти героя заносишь его в стек. Запоминаешь отдельно его координаты в паралелльном массиве. И при касте абилки пробегаешься по массиву юнитов. И делаешь выборку из тех, чьи координаты подошли.
Так и сделал)
0
15
7 лет назад
0
EvilPenguin, как? Паралльельные массивы или Revive? Или условие поставил <=0?
0
12
7 лет назад
Отредактирован EvilPenguin
0
EnergyFrost:
EvilPenguin, как? Паралльельные массивы или Revive? Или условие поставил <=0?
У меня в мапе и так есть массив героев, а точнее массив игроков ( эт структура ) и в этой структуре указан герой которым владеет игрок ну и стата игрока. Так что я просто пробегаюсь по нему и если герой мертв и расстояние от него до точки каста < 100, то долбавляю его в группу на респ. Потом из группы выбираю рандомного и ресаю. Группа нужна на случай если несколько игроков умерло рядом. Без группы ресался герой который стоит первее по списку, а так какой никакой рандом)
Для меня до сих пор загадка почему GetUnitsInRange не видит мертвых героев. Условие вроде правильное. А ловить юнитов проверкой хп <=0 не вариант я от нее вообще отказался. Например у меня есть герой которому я постоянно даю и меняю "зеленую" силу и в итоге если он умирает то его здоровье больше нуля и он даже начинает регенится ( он мертвый при этом ) это было наглядно видно в мультиборде куда я вывожу хп. В итоге проверка на хп < 0 не даст эффекта потому что хп > 0 но герой при этом мертвый кстати если поставить мертвому юниту хп >0 то поидеи он как раз начинает ловится функцией GetUnitsInRange. Я замечал это на одном своем скиле где на месте некоторых мертвых юнитов появлялись эффекты. Так как раз для отсева живых от мертвых я юзал ( GetWidgetLife ( GetFilterUnit () ) > 0.405 )
0
21
7 лет назад
0
абила с выбором цели которая кастуется на область
Мог бы перефразировать?
0
12
7 лет назад
0
GF RaiseD:
абила с выбором цели которая кастуется на область
Мог бы перефразировать?
Способность на базе "Канала" с типом наведения "цель - точка".
0
27
7 лет назад
Отредактирован MpW
0
EvilPenguin, если действительно так не работает, не пробовал сохранять координаты при смерти героев, а потом проверить не попадают ли эти координаты в область и ресаем?
0
21
7 лет назад
0
С мертвыми героями в варе вообще странности (если кто, кстати, не знает, при массовых смертях и мб не только герой вообще может просто исчезнуть и последняя известная информация о нём опустошиться, так что всем советую на такой случай впиливать костыль пересоздания с запоминанием важнейших данных на момент смерти).
0
13
7 лет назад
0
Так что я просто пробегаюсь по нему и если герой мертв и расстояние от него до точки каста < 100, то долбавляю его в группу на респ. Потом из группы выбираю рандомного и ресаю.
Так то умершый герой не имеет координатов. При смерти героя записуешь координаты и при касте цыклом сверяешь растояние координатов.
0
12
7 лет назад
0
Не знаю но у меня GetUnitX и GetUnitY без проблем ловят координаты мертвых героев.
0
15
7 лет назад
0
Так в чем проблема сделать так, как я сказал. А случайность юнита из группы определять через while и exitwhen GetRandomInt(1, кол-во героев в группе) ==1
0
12
7 лет назад
0
EnergyFrost:
Так в чем проблема сделать так, как я сказал. А случайность юнита из группы определять через while и exitwhen GetRandomInt(1, кол-во героев в группе) ==1
Да я уже все сделал как бы. Просто не могу понять почем GroupEnumUnitsInRange( gr, x, y, rng, filter ) не ловит дохлых геров)
Вот как я сделал респаун и GetUnitX и GetUnitY нормально ловят координаты дохлого героя.
p.s: в коде много функций из моей либы и не только так что не пугайтесь
function Trig_SoulLantern_Conditions takes nothing returns boolean
    return msc_check_item_for_id ( GetTriggerUnit (), GetIssuedOrderId (), 'Pr1L' )
endfunction

function Trig_SoulLantern_Actions takes nothing returns nothing
    local unit u = GetTriggerUnit ()
    local real x1 = GetOrderPointX ()
    local real y1 = GetOrderPointY ()
    local unit trg 
    local item it = msc_get_item_by_o_id ( u, GetIssuedOrderId () )
    local group gr = CreateGroup ()
    local real x2
    local real y2
    local real dist
    local integer i = 0
    loop
        set x2 = GetUnitX ( msc_Players.msc_player[i].hero )
        set y2 = GetUnitY ( msc_Players.msc_player[i].hero )
        set dist = msc_dist_between ( x1, x2, y1, y2 )
        if ( dist < 300.0 ) and ( IsUnitType ( msc_Players.msc_player[i].hero , UNIT_TYPE_DEAD ) ) then
            call GroupAddUnit ( gr, msc_Players.msc_player[i].hero )
        endif
        set i = i + 1
        exitwhen ( i == msc_Players.player_count )
    endloop
        
    set trg = GroupPickRandomUnit ( gr )
    
    if ( trg != null ) and ( GetItemCharges ( it ) > 0 ) then
        call CrossRespawn.respawn ( trg, 50.0, 50.0, GetUnitX ( trg ), GetUnitY ( trg ) )
    else
        if ( trg == null ) then
            call SimError ( GetOwningPlayer ( u ), "Можно применять только на могилы" )
        endif
        if ( GetItemCharges ( it ) == 0 ) then
            call SimError ( GetOwningPlayer ( u ), "Зарядите Фонарь при помощи Крестов" )
        endif
        call SetItemPosition ( it, 0, 0 )
        call msc_give_item_delay ( u, it, 0.00 )
    endif
    
    call DestroyGroup ( gr )
    set u = null
    set trg = null
    set it = null
    set gr = null
endfunction

//===========================================================================
function InitTrig_SoulLantern takes nothing returns nothing
    set gg_trg_SoulLantern = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_SoulLantern, EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER )
    call TriggerAddCondition( gg_trg_SoulLantern, Condition( function Trig_SoulLantern_Conditions ) )
    call TriggerAddAction( gg_trg_SoulLantern, function Trig_SoulLantern_Actions )
endfunction
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.