Казалось бы, вопрос элементарный, а меня можно задизлайкать за непонимание очевиднейших вещей. Но всё не так просто, как кажется.
Ситуация такая. Есть триггер (а вернее их три разных, выполняющихся в разных местах и в разное время, друг другу они не мешают совершенно), который срабатывает после завершения таймера. Там происходит много всяких действий, одно из которых - повышение переменной 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 секунды обновляет ресурсы. А вместе с этим и обнуляет снова и снова мою переменную. Обнаружил ли я это через дебаги? Нет, просто от скуки и безнадёжности положения начал прокручивать и листать все триггеры.
Спасибо всем, кто пытался помочь, это было очень приятно) Мне жаль, что вы ломали голову и тратили время впустую по моей глупости и невнимательности.
`
ОЖИДАНИЕ РЕКЛАМЫ...
22
If Fountain == 2 then set Fountain = 3
If Fountain == 1 then set Fountain = 2
If Fountain == 0 then set Fountain = 1
Забыл уточнить вот в этом моменте. Если порядок поменять, то работает всё великолепно. Сначала Fountain приравнивается единице, затем двойке, а в конце тройке.
В имеющейся же последовательности переменная успешно становится единицей, а в двух других триггерах эти три строки благополучно игнорирует, абсолютно отказываясь увеличиваться.
24
Первый способ должен работать, проблема где-то в другом месте.
22
prog, можешь, пожалуйста, посмотреть, в каком именно? Потому что абсолютно весь триггер работает идеально, кроме этого единственного момента.
22
Hate, к сожалению, описанный тут способ никак не помогает. Сам по себе set 'переменная' = 'переменная' + 'число' у меня есть. В условиях ошибки нет никакой тоже. Сами триггеры работают прекрасно, а условные операторы должны быть именно такими и выполняться лишь при конкретном значении Fountain.
21
зачем такой длиннющий ифзенэлс в одну строку?
попробуй разбить на несколько помельче последовательных друг в друге чтобы смысл в итоге был тот же
22
ClotPh, у меня во втором способе и было разбиение такое. Не работает оно.
24
Rare, я не занимаюсь поиском багов в чужом коде. Особенно когда в дело замешано больше одного триггера и вейты. Могу по советовать выводить на время отладки текстом имена сработавших триггеров и значения переменной в трех местах - сразу после срабатывания триггера, после вейта и после присвоения (все три с именем триггера, чтобы понимать откуда эти значения), а еще пригодится отладка в местах где активируются эти триггеры и запускается таймер.
28
Используй If/Then/Else, который позволяет вставлять несколько действий.
Убери Do Nothing.

Есть такая вещь как Object Manger (F11). Посмотри там, где используется переменная Fountain.
Если она используется только, где надо, то проблема не тут.

У тебя есть пауза. Пока она идёт, значение Fountain может поменяться.
Fountain общая для всех этих триггеров? Эти триггеры часто используются? Могут ли они пересекаться (уточняю)?
21
сделай отладку, в начале триггера Fountain точно 1? Или все-таки в 0 превращается?
22
вейты
А в них может быть какая-либо проблема?
замешано больше одного триггера
Все три совершенно одинаковые. Одновременно друг с другом они не работают, т.к. запуск таймера для каждого из них зависит от попадания одного конкретного героя в конкретную область. Следовательно их кол-во совершенно никакой роли не играет.
могу по советовать выводить на время отладки текстом имена сработавших триггеров
Собственно, это тоже бесполезно, т.к. я всегда знаю, который триггер работает в данную секунду просто исходя из локации на карте, в которую я привёл героя
значения переменной в трех местах - сразу после срабатывания триггера, после вейта и после присвоения
Опять же, зачем, если я и так знаю, что моя переменная постоянно остаётся равной 1?
ClotPh,
сделай отладку, в начале триггера Fountain точно 1? Или все-таки в 0 превращается?
Переменная не может вообще стать нулём. Она ему приравнивается при запуске карты,а далее есть лишь операторы на её увеличение (и только в скинутом мной триггере, более нигде в коде я с этой переменной не работаю)
28
Опять же, зачем, если я и так знаю, что моя переменная постоянно остаётся равной 1?
Ты в этом уверен? Тебе дали хороший совет.
сразу после срабатывания триггера, после вейта и после присвоения (все три с именем триггера, чтобы понимать откуда эти значения)
Сделать это несложно.
Баг не в том, что +1 не работает. +1 работает хорошо, просто с глобалками надо аккурантей.

А также это.
Есть такая вещь как Object Manger (F11). Посмотри там, где используется переменная Fountain.
Если она используется только, где надо, то проблема не тут.

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