Делаю проект для мультиплеера, но столкнулся с такой проблемой:
  • Как сделать нормальное воскрешение героев после смерти?
Я пробовал разные способы, но работает только один и этот способ будет баговать при игре с игроками.
Просьба давать советы на GUI. С Jass не дружу.

Очень просто)

События:
Юнит Умирает
Условия:
(Diying unit) равно Герой
Owner of (Diying unit) не равно Нейтрально-враждебный
Действия:
Wait 10 секунд
Воскресить (Diying unit)

В этом триггере (Diying unit) не будет меняться с каждой новой смертью, она как локалка.
`
ОЖИДАНИЕ РЕКЛАМЫ...
22
Совсем без джасса, т.е. без локальных переменных?
Ну можно хранить героев и время до воскрешения в массивах, пробегаться по ним циклом по таймеру, и когда время достигает 0 воскрешать героя.
триггер1 - герой умер - установить время до реса №индекс_игрока на столько-то сек.
триггер2 - каждые 0,3 сек - цикл А от 1 до сколько там игроков - если герой №А мертв, то отнять 0,3 от времени №А; если время меньше либо равно 0, воскресить героя №А
17
biridius, ну, если ты подскажешь как это сделать на джасс. Я просто не разбираюсь.
Попробую сделать по твоему примеру
26
Очень просто)

События:
Юнит Умирает
Условия:
(Diying unit) равно Герой
Owner of (Diying unit) не равно Нейтрально-враждебный
Действия:
Wait 10 секунд
Воскресить (Diying unit)

В этом триггере (Diying unit) не будет меняться с каждой новой смертью, она как локалка.
Принятый ответ
12
8gabriel8:
Очень просто)

События:
Юнит Умирает
Условия:
(Diying unit) равно Герой
Owner of (Diying unit) не равно Нейтрально-враждебный
Действия:
Wait 10 секунд
Воскресить (Diying unit)

В этом триггере (Diying unit) не будет меняться с каждой новой смертью, она как локалка.
Я 100% уверен, что это ложь и провокация.
12
8gabriel8:
Sergarr, проверь. Мне тоже так казалось раньше)
Проверил. Действительно, работает. Прям как то неожиданно даже - нативная поддержка МУИ? В варике?
26
Игре уж много лет, а она всё удивляет и удивляет
18
Sergarr:
Я 100% уверен, что это ложь и провокация.
GetTriggeringUnit() и прочее - хранятся в самом потоке, а поток создается каждый раз при срабатывании триггера
И лучше не использовать PolledWait, можно сразу TriggerSleepAction
И кто бы ни говорил, TriggerSleepAction не продолжает отсчет при паузе в одиночной игре и в мультиплеере.
18
близзарды походу давно починили это в каком то патче, но этого никто не узнал
26
И лучше не использовать PolledWait, можно сразу TriggerSleepAction
А что так?
18
8gabriel8:
И лучше не использовать PolledWait, можно сразу TriggerSleepAction
А что так?
Ну в PolledWait не очищается переменная указывающая на таймер
Да и вообще PolledWait это смесь TriggerSleepAction и таймера (типа отсчет игрового времени)
В данное время не актуально, т.к я лично проверял TriggerSleepAction в одиночной игре при паузе и в мультиплеере так же, никуда время не утекало.
22
8gabriel8, PolledWait это бж функция внутри которой жуть что делается
спс жнгп за Function list
function PolledWait takes real duration returns nothing
    local timer t
    local real  timeRemaining

    if (duration > 0) then
        set t = CreateTimer()
        call TimerStart(t, duration, false, null)
        loop
            set timeRemaining = TimerGetRemaining(t)
            exitwhen timeRemaining <= 0

            // If we have a bit of time left, skip past 10% of the remaining
            // duration instead of checking every interval, to minimize the
            // polling on long waits.
            if (timeRemaining > bj_POLLED_WAIT_SKIP_THRESHOLD) then
                call TriggerSleepAction(0.1 * timeRemaining)
            else
                call TriggerSleepAction(bj_POLLED_WAIT_INTERVAL)
            endif
        endloop
        call DestroyTimer(t)
    endif
endfunction
18
biridius, судя по тому что в BJ есть много туповатых функций и ещё некоторые функции должны быть в движке - могу предположить что программисты написали движок с нативками, отдали игру гейм-дизайнерам и послали их подальше
26
Ну в PolledWait не очищается переменная указывающая на таймер
Чего-то не пойму, вон есть же DestroyTimer(t), нужно ещё как-то очищать?
18
t = null
потому что близзардам прямоты рук не хватило чтобы сделать нормальную работу с памятью.
Не было бы претензий если это был бы какой то высокоуровневый яп или низкоуровневый, но это же jass)
По сути все переменные handle - это те же integer, не понимаю как близзарды с этим накосячили
10
Очень просто)
События:
Юнит Умирает
Условия:
(Diying unit) равно Герой
Owner of (Diying unit) не равно Нейтрально-враждебный
Действия:
Wait 10 секунд
Воскресить (Diying unit)
В этом триггере (Diying unit) не будет меняться с каждой новой смертью, она как локалка.
Согласен на 99%, но лучше при пике героя каждому герою присвоить свою переменную
17
8gabriel8, работать то работает, но тут немного баги будут. Все герои будут появляться только в одной области, а мне такое не нужно. У меня 2 разные команды
А, все, разобрался
26
Согласен на 99%, но лучше при пике героя каждому герою присвоить свою переменную
Ну это больше зависит от остальных триггеров.
Интересно, тут переменная (Diying unit) тоже не утекает?
18
8gabriel8:
Интересно, тут переменная (Diying unit) тоже не утекает?
это не переменная, это нативка которая берет инфу из потока и возвращает юнита
28
В этом триггере (Diying unit) не будет меняться с каждой новой смертью, она как локалка.
Ага, а вот если бы я занёс Dying Unit в переменную, то она бы менялась с каждым вызовом триггера.
Sergarr:
поддержка МУИ
Что же такое МУИ?
26
Что же такое МУИ?
multi user instance, если верно помню, означает что можно применять несколько раз и не будет никаких маразмов
26
но лучше при пике героя каждому герою присвоить свою переменную
ещё лучше при каждой смерти юнита, чекать его на воскрешение (либо отдельный ивент на него/них заводить), и поднимать напрямую из записи...
32
Вейты в мультимплеере нормально работать не будут это раз, два пора давать уже по башке за такие советы. Есть куда более простые и изящные решения, два массива - один массив героев, второй массив таймеров - герой умер, проверяем есть ли герой в массиве, если есть ищем таймер с таким же номером как у героя в массиве и запускаем его, во втором триггере ставим событие что любой из таймеров истек, действие найти таймер в массиве и воскресить героя, которого ищем по номеру таймера в массиве - легко и просто, работает стабильно на всех патчах, не будет никакого говна и неточностей, во многих картах близзардов есть такой код - копируй не хочу.
26
quq_CCCP, с чего это Wait не будет в мультиплеере работать?
Чтобы оставить комментарий, пожалуйста, войдите на сайт.