Доброго времени суток, знатоки. У меня возникла проблема с воскрешением героев после их смерти.
Иногда (не всегда), случается такое, что умерший герой не воскрешается (то таймер в таблице не появляется, из-за чего и не воскрешается герой, то таймер появится, пройдет до ноля, а герой не воскресится), при чем один игрок (герой) воскрешается а другой нет.
Короче есть три основных триггера которые и отвечают за воскрешение героев, см. ниже:
Тут при смерти героя, задается значение таймера (последнее действие триггера "set T[(player number of dying unit)] = (Hero level of dying unit * 5) + 10")
Тут у нас идет отчет времени (каждую секунду) до момента воскрешения (отчет записывается в таблицу, чтоб игроку было видно когда воскреснет герой), по завершении отчета, если переменная Т(номер трупа игрока =) ) равна нолю, и в то же время герой игрока еще мертв, то бежит к след. триггеру.
В этом триггере происходит само воскрешение героя.
Так вот, господа знатоки, подскажите что не так? (полюзуюсь исключительно граф интерфейсом триггеров, jass не получается осилить =(( )
За ранее благодарен, с уважением, Cardinal
Проблема решена, багов с воскрешением нет. (возможно проблема была в вейтах)

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

Cardinal, за такое именование переменных нужно по рукам бить.
то бежит к третьему триггеру которій и воскрешает
Не плодите триггеров, все нужные действия можно и в цикле сделать.
У вас переменная T отвечает за состояние героя, зачем проверять жив юнит или нет?
T<0 Жив
T==0 Нужно воскресить прям сейчас
T>0 Ждёт воскрешения
Cardinal:
T[номер героя] болше или равна 1
больше или равна 0 => T[] = T[] -1
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
26
5 лет назад
0
А в HeroKill что в If/Then/Else?
Как же сложно составил систему.
У каждого игрока только один герой? Не обладает ли багующий герой способностью Иллюзии?
Ещё проблема может быть с циклом по А, не приходилось лично с этим сталкиваться, но люди рассказывали о проблемах, когда используют одновременно несколько циклов по А в одном или нескольких триггерах, типа значение А из одного цикла передаётся другому, в итоге они сбоят. Нужно использовать и циклы по А, и по В, и по своим переменным.
0
29
5 лет назад
0
Подскажите что не так с моим методом воскрешения героев!
Она на GUI))
jass не получается осилить
осиливайте lua, он полегче
do
    local TRIGGER = CreateTrigger()
    for i = 0, bj_MAX_PLAYER_SLOTS - 1, 1 do
        TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_DEATH)
    end
    TriggerAddCondition(
        TRIGGER,
        Condition(
            function()
                return not IsUnitIllusion(GetTriggerUnit()) and not IsUnitType(GetTriggerUnit(), UNIT_TYPE_SUMMONED) and
                    IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO)
            end
        )
    )
    TriggerAddAction(
        TRIGGER,
        function()
            local hero = GetTriggerUnit()
            TimerStart(
                CreateTimer(),
                3 * GetHeroLevel(hero),
                false,
                function()
                    local x = GetPlayerStartLocationX(GetOwningPlayer(hero))
                    local y = GetPlayerStartLocationY(GetOwningPlayer(hero))
                    ReviveHero(hero, x, y, true)
                    DestroyTimer(GetExpiredTimer())
                end
            )
        end
    )
end
Не обладает ли багующий герой способностью Иллюзии?
Я сам так попался, так что теперь IsUnitIllusion() мой лучший друг)
0
1
5 лет назад
0
8gabriel8, у каждого игрока только один герой, багующих способностей типа иллюзии нет, а на счет цикла, то хз, я и по А и по В и по собственным переменным использую циклы, но по А их больше чем остальных.. раньше триггер который считает секунды был больше, вместо цикла по А было просто 12 раз повторение для каждого игрока, но результат был тот же, иногда какой-либо герой не воскрешался (от юнита тоже не зависит.)
NazarPunk, ну я пока на версии 1.30 сижу, вижу в ин-нете пишет что что-то там на 1.31 не так с переходом, пока не рискую.. а на счет lua может быть, визуально он мне php напоминает, но пока хочу только GUI ограничится.. должен же быть способ решить эту проблему и на GUI =)
0
26
5 лет назад
0
В свёрнутом If/Then/Else что?
1
29
5 лет назад
Отредактирован nazarpunk
1
а на счет lua может быть, визуально он мне php напоминает
он больше на js похож.
должен же быть способ решить эту проблему и на GUI
Эллегантные решения можно и на гуи сделать, а не плодить блоки копипастой
у каждого игрока только один герой
Дык вообще элементарно
Переменные
  • HERO[] Боевая единица
  • HERO_REVIVE_LOC[] Точка
  • HERO_REVIVE_TIME[25] = -1 Целлочисленная
  • HERO_REVIVE_TIMER Таймер
Если герой умирает, то заносите в HERO_REVIVE_TIME по id игрока время воскрешения.
Запускаете HERO_REVIVE_TIMER с периодом в секунду и проверяете HERO_REVIVE_TIME.
Если меньше ноля, то герой жив, здоров и радуется жизни.
Если больше, то ожидает воскрешения в курилке
Если равно, то с вещами на рэспаун в HERO_REVIVE_LOC.
Надеюсь уточнять, что с каждым тиком нужно уменьшать HERO_REVIVE_TIME не нужно)
0
1
5 лет назад
0
8gabriel8, в свернутом только награды за убийство и т.д., с того триггера за воскрешение только последнее действие отвечает (точней за число секунд в таймере)
NazarPunk, есть переменные:
uHero[1-12] - боевая еденица на каждого игрока
T[1-12] - целочисленная, равна кол-ву секунд до воскрешения
есть еще две области (StartTeam1/StartTeam2) - области где восрешается герой той или иной команды
В идеале работать должно так: герой умер и первый триггер записал в переменную T[номер игрока убитого героя] кол-во секунд до воскрешения, второй триггер постоянно каждую секунду проверяет, если герой мертв равно да, жив равно нет, а переменная T[номер героя] болше или равна 1, то переменная T[] = T[] - 1, а если герой мертв равно да, жив равно нет, а переменная T[] равна 0, то бежит к третьему триггеру которій и воскрешает. по логике оно должно работать, но иногда не срабатывает.. кстати переменная T[] еще нужна для того что бы время до воскрешения показывать в таблице (мультиборде)..
1
29
5 лет назад
1
Cardinal, за такое именование переменных нужно по рукам бить.
то бежит к третьему триггеру которій и воскрешает
Не плодите триггеров, все нужные действия можно и в цикле сделать.
У вас переменная T отвечает за состояние героя, зачем проверять жив юнит или нет?
T<0 Жив
T==0 Нужно воскресить прям сейчас
T>0 Ждёт воскрешения
Cardinal:
T[номер героя] болше или равна 1
больше или равна 0 => T[] = T[] -1
Принятый ответ
0
1
5 лет назад
0
NazarPunk, тоесть если Т[] = 0, 1, 2, 3, ... n, то T[] = T[] -1 (значит герой мертв еще)
если T[] = 0, то T[] = T[] -1, и тут же воскрешаем героя
а если T[] = -1, то ничего уже и не делаем, ибо герой уже воскрешен, я правильно Вас понял? и тогда отпадает смысл в проверке жив или мертв герой..?
и третий триггер всунуть во второй в цикл, так?
1
29
5 лет назад
1
тоесть если Т[] = 0, 1, 2, 3, ... n, то T[] = T[] -1 (значит герой мертв еще)
T > 0 это 1,2,3, ... n, а в остальном всё верно. И до кучи избавьтесь от вэйтов.
0
1
5 лет назад
Отредактирован Cardinal
0
NazarPunk, в результате получилось такое, пока еще не тестировал на работоспособность, вравильно воплотил Вашу мысль?
Загруженные файлы
0
29
5 лет назад
0
Cardinal, что за поклонение копипасте?
Да ещё и с протекающими точками. Я же писал за переменную HERO_REVIVE_LOC. В начале создали по точке каждому игроку и воскрешайте по ид игрока.
Загруженные файлы
3
26
5 лет назад
3
По-быстрому сваял систему из 2 триггеров, но без мультиборда
И не нужно делать двойную проверку, что Герой мёртв Да, а Герой жив Нет.
Загруженные файлы
0
29
5 лет назад
0
По-быстрому сваял систему из 2 триггеров, но без мультиборда
Вписать в неё мультиборд очень легко)
0
1
5 лет назад
0
NazarPunk, по поводу точек, тупанул, мой косяк) щяс переделаю
0
26
5 лет назад
0
Вписать в неё мультиборд очень легко)
Да, просто у него как-то непонятно со статусом игрока. Если Играет, то меняем значение в мультиборде, а если Не играет, то значение замораживается до конца игры что ли? Привык, что указывается ливнул или что-то такое, вот и не стал с мультибордом морочиться.
0
1
5 лет назад
0
Так должно получится в итоге?
8gabriel8, у меня типа резиновый мультиборд, тоесть если играет 4 игрока то в мультиборде только 4 игрока показано, а если 7 то и показано 7 игроков, потому и проверка если играет
проверка для того что бы не писало лишних значений если не играет игрок.. что-то вроде того..
Загруженные файлы
0
26
5 лет назад
0
Вместо действия воскрешения героя поставил бы
If ((Integer A) меньше 7) Then Воскресить в StartTeam1 Else Воскресить в StartTeam2
0
1
5 лет назад
Отредактирован Cardinal
0
8gabriel8, я уже по переменной точке сделал, пока работает отлично, буду тестить с другом, он за другую команду будет играть, там и посмотрим вылезает ли проблема снова или уже решена.
NazarPunk, благодаря Вашим замечаниям мне получилось существенно упростить один триггер а другой и вовсе удалить)
Большое Вам обоим спасибо за советы и подсказки, после теста с другом, еще отпишусь, и обязательно скажу решилась ли проблема. А в своей карте напишу Вам благодарности)))
Возможно XGM будет первым ресурсом где опубликую карту))
0
26
5 лет назад
0
И до кучи избавьтесь от вэйтов.
Cardinal, кстати, Wait настоятельно не рекомендуют использовать в циклах и категорически нельзя использовать в действиях с группой. Может быть из-за него проблема и возникала. Если разбирать ваш изначальный случай с тремя триггерами, Wait следовало перенести из второго триггера, где он задействован в цикле, самым первым действием в третий триггер.
0
1
5 лет назад
0
8gabriel8, возможно и из-за него и была проблема, я раньше слышал (вернее читал), что вэйты очень проблематичные по своей природе, но как-то не обратил внимания что у меня вэйт в важном триггере находится, но с упрощенной воскрешалкой уже вэйта нету, а значит и проблемы скорее всего и не будет.. кстати а чем можно заменять вэйты, если они вдруг очень необходимы?
2
26
5 лет назад
2
таймерами
0
26
5 лет назад
0
Один из наших пользователей сделал карту с примерами удаления утечек в графических триггерах, чуть-чуть её подредактировал. Может быть пригодится:
Загруженные файлы
0
1
5 лет назад
0
8gabriel8, спасибо за карту, изучу.. потом еще напишу что да как с воскрешением и т.д.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.