Казалось бы, вопрос элементарный, а меня можно задизлайкать за непонимание очевиднейших вещей. Но всё не так просто, как кажется.
Ситуация такая. Есть триггер (а вернее их три разных, выполняющихся в разных местах и в разное время, друг другу они не мешают совершенно), который срабатывает после завершения таймера. Там происходит много всяких действий, одно из которых - повышение переменной Fountain на 1 (при запуске карты она обнуляется конечно же).
Сам триггер (как и другие два) выглядит вот так:
Беда в том, что триггер выполняется абсолютно весь. Окно таймера сворачивается, анимации пропадают, юнит, который должен замениться, заменяется и т.д. Всё работает. Кроме увеличения переменной Fountain на 1. Мной было использовано 3 различных способа.
Первый (самый очевидный) через оператор set variable. То есть
Set Fountain = Fountain +1
Казалось бы, должно работать. И да, в самый первый раз наша нулевая переменная становится равной 1. А вот во второй раз становиться двойкой, а в третий раз тройкой она почему-то не хочет. И потому в каждый из трёх раз мне проигрывается действие с условием "if Fountain == 1".
Далее я всё поменял. Разбил действие на три, а именно:
If Fountain == 2 then set Fountain = 3
If Fountain == 1 then set Fountain = 2
If Fountain == 0 then set Fountain = 1
Именно в этом порядке. Каков результат? От прошлого не отличается он ничем совершенно.
Ну а последний способ можете посмотреть на картинке.
По сути, тот же второй, но всё умещено в одно условие. Исход, как вы понимаете, снова печальный и нерабочий.
Собственно, вопрос мой таков: если я всё же ошибся, то в чём именно? А если не ошибся и делал верно, то какие ещё способы существуют для увеличения значения переменной на 1 (оператор Inc() я искал, безуспешно).
Я действительно не понимаю, это у меня голова не работает совершенно, или в редакторе какие-то баги
П.С. JASS и его разновидности не знаю совершенно, огромная просьба объяснять и советовать исключительно с использованием стандартных триггеров.
П.П.С. Если что, у меня версия игры 1.26

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

8gabriel8,
Если что, скидывай карту.
Беда в том, что эта карта из кампании, там всё очень много весит, потому не буду.
PT153,
ну как там дела?
Пока никак, ибо из-за сессии отложил редактор в сторону (собственно, даже сюда времени зайти не было, к сожалению)
Рад, что ты предложил выход, но я, боюсь, твой код себе никак не перенесу, ибо, как писал в вопросе, лишь на GUI могу работать.
8gabriel8,
мне кажется, проблема не в этом триггере, а в другом, который запускает триггеры и таймеры.
Триггер, запускающий таймер, вряд ли многое испортить может
Мдаааа... Я свою ошибку таки нашёл. Она была в самом тупом месте из всех возможных.
Я действительно не понимаю, это у меня голова не работает совершенно, или в редакторе какие-то баги
Цитата из вопроса, у меня не работает голова.
Так вот, это я дурак полный.
Запихнул обнуление своей переменной ВНИМАНИЕ! в триггер, который игрокам-компьютерам каждые 2 секунды обновляет ресурсы. А вместе с этим и обнуляет снова и снова мою переменную. Обнаружил ли я это через дебаги? Нет, просто от скуки и безнадёжности положения начал прокручивать и листать все триггеры.
Спасибо всем, кто пытался помочь, это было очень приятно) Мне жаль, что вы ломали голову и тратили время впустую по моей глупости и невнимательности.
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
2
24
5 лет назад
Отредактирован prog
2
второй смущающий меня момент - в описании первого способа (правильного), у тебя указано что возможны значения и 1 и 2, но не 3, а в комментариях ты ищеш решение какой-то другой проблемы, при которой значение всегда равно 1.
А, нет, мой косяк, не достаточно внимательно прочитал.
0
23
5 лет назад
0
если это глобальный квест не для каждого игрока то делай глобальный переменную на 0 при входа запускаем таймер и чекает интервал что игрок не ушел от зоны 5 сек обшего и срабатывает и отключаем триггер если не было 2 вызо фонтана то паузим и счетик растет а у тя там не знаю... каша какая то!
2
22
5 лет назад
2
в описании первого способа (правильного), у тебя указано что возможны значения и 1 и 2, но не 3
Вот твой вопрос
Первый (самый очевидный) через оператор set variable. То есть
Set Fountain = Fountain +1
Казалось бы, должно работать. И да, в самый первый раз наша нулевая переменная становится равной > 1. А вот во второй раз становиться двойкой, а в третий раз тройкой она почему-то не хочет. И потому в
каждый из трёх раз мне проигрывается действие с условием "if Fountain == 1".
Вот моё описание первого способа
Я нигде не говорил тех вещей, которые темя смутили.
в комментариях ты ищеш решение какой-то другой проблемы, при которой значение всегда равно 1.
Эта та же самая проблема. Увеличение на 1 не срабатывает во второй и третий раз => переменная постоянно равна 1 => я об этом пишу
pro100master,
если это глобальный квест не для каждого игрока
В карте только один игрок, который может это выполнить
делай глобальный переменную на 0
Она у меня в начале карты обнуляется, я это указал
при входа запускаем таймер и чекает интервал что игрок не ушел от зоны
Уйти он не может, при запуске таймера герой ставится на паузу и вывести его невозможно до истечения времени или смерти
а у тя там не знаю... каша какая то
Я вполне хорошо и подробно всё расписал. И не хочу обидеть, но каша, к сожалению, у тебя небольшая вышла, т.к. твой текст без единой запятой мне читать и понимать очень трудно
5 сек обшего и срабатывает и отключаем триггер если не было 2 вызо фонтана то паузим и счетик растет
Вот этот кусок я не понял, например.
4
24
5 лет назад
4
Rare, да, я уже перечитал еще раз, мой косяк.
Настоятельно рекомендую во-первых вернуться к первому способу, а потом вывести значение переменной в трех указанных мной местах - в начале триггера, сразу после вейта и сразу после присвоения. Да, по косвенным признакам все выглядит так будто переменная всегда равна 1 и присвоение не работает, но так ли это на самом деле можно узнать только с помощью отладки (есть еще минимум два варианта попадающих под эти-же косвенные признаки, с другими значениями переменной).
2
22
5 лет назад
2
prog, и всё же я не понимаю, зачем после вейта что-либо ставить и выводить, если в течение этой 1 секунды нигде с переменной не проводится манипуляций. Не может же она сама по себе без приказа операторов поменяться? А если может, то я вряд ли способен это исправить, тут код самого редактора открывать надо и косяки близзов исправлять.
В начале триггера и после присвоения понимаю зачем, это попробую сделать. Если честно, не верю в хороший итог, но другого не остаётся ничего.
2
24
5 лет назад
2
зачем после вейта что-либо ставить и выводить
Чтобы убедиться что за эту секунду действительно не произошло ничего лишнего. По сути, не обязательное действие, но меня много раз выручало и помогало найти мои косяки в самых неожиданных местах.
0
28
5 лет назад
Отредактирован PT153
0
А зачем? Я всегда его ставлю, никогда проблем не было (а вот при отсутствии были)
Прикол в том, что эта функция имеет такой код.
function DoNothing takes nothing returns nothing
endfunction
Ты серьёзно думаешь, что её наличие на что-то влияет?
При её отсутствии проблем тем более не будет, дело было точно не в ней.
А это практично?
Практичнее кликать по 100500 окошкам? Я говорил про тот большой if, где ты присваиваешь Fountain.
Из-за чего она поменяется, если никаких манипуляций с ней не проводится?
Пока идёт пауза, этот триггер может сработать ещё раз.
У тебя есть пауза в 1 сек., потом если Fountain == 1, то идёт пауза до окончания звука, а после ещё пауза в 3 секунды. После этого проверяется условие Fountain == 2, если да, то пауза до окончания звука, а после ещё пауза в 3 секунды. Далее проверяется условие Fountain == 3, если да, то пауза до окончания звука, а после ещё пауза в 3 секунды.
2
22
5 лет назад
2
prog, ну посмотрим тогда. Поставлю на всякий случай. Но если переменная действительно меняется в момент вейта, единственный способ избавить от проблемы - просто снести из карты данное задание, забыть навсегда про все подобные в других картах и никогда к ним не возвращаться, ибо я не представляю, где и какую ошибку в таком случае придётся исправлять.
Потому, повторюсь уже в который раз, никакой другой триггер в эту секунду Fountain никоим образом изменить не в состоянии. Персонаж, запускающий вес процесс на карте всего один, одновременно в трёх местах он оказаться не в состоянии ни при каких условиях, а значит и три моих триггера запустить одновременно он тоже не может.
0
24
5 лет назад
Отредактирован prog
0
Rare, Еще одна рекомендация, больше декоративного характера - избавиться от двух из трех триггеров и вместо этого выносить в глобалку фонтан который нужно заменять. Результат тот-же, но два триггера разменяны на одну глобалку и не надо в трех местах править одни и те же действия когда нужно что-то поменять.
2
22
5 лет назад
2
PT153,
Пока идёт пауза, этот триггер может сработать ещё раз.
Не может он сработать ещё раз ни при каких обстоятельствах. Первую причину я чуть выше описал, а вторая состоит в том, что при срабатывании он тут же отключается.
prog,
избавиться от трех триггеров и вместо этого выносить в глобалку фонтан который нужно заменять
Если придумаю, как это всё устроить, то сделаю.
Спасибо за все советы. Пойду проверять тогда с выводом. Потом вернусь сюда, сообщу результаты.
2
28
5 лет назад
Отредактирован PT153
2
Как я понял, сначала триггер должен сделать для Fountain == 1 и завершиться. Потом для Fountain == 2, и завершиться. И далее для Fountain == 3.
Если так, то нужно убрать у всех трансляций паузу (Не ждать) и сделать так.
set Fountain = Fountain + 1
Если
    Fountain == 1
Тогда
    Трансляция
Иначе
    Если
        Fountain == 2
    Тогда
        Трансляция
    Иначе
        Если
            Fountain == 3
        Тогда
            Трансляция
        Иначе
            <пусто>

Стоп-стоп-стоп, а сколько вообще раз этот триггер срабатывает?
Не может он сработать ещё раз ни при каких обстоятельствах. Первую причину я чуть выше описал, а вторая состоит в том, что при срабатывании он тут же отключается.
Казалось бы, должно работать. И да, в самый первый раз наша нулевая переменная становится равной 1. А вот во второй раз становиться двойкой, а в третий раз тройкой она почему-то не хочет. И потому в каждый из трёх раз мне проигрывается действие с условием "if Fountain == 1".
Если только 1 раз, то и переменная увеличится 1 раз, всё логично же.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.