Казалось бы, вопрос элементарный, а меня можно задизлайкать за непонимание очевиднейших вещей. Но всё не так просто, как кажется.
Ситуация такая. Есть триггер (а вернее их три разных, выполняющихся в разных местах и в разное время, друг другу они не мешают совершенно), который срабатывает после завершения таймера. Там происходит много всяких действий, одно из которых - повышение переменной 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
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 вызо фонтана то паузим и счетик растет а у тя там не знаю... каша какая то!
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.