Очень странная штука. Если два раза кликнешь на предмет который активируется, то выполняется действие, а потом, когда оно завершено, выполняется снова (если условия позволяют), как если бы ты снова кликнул на активатор. Но ты не кликал, ты в первый раз кликнул два раза и второй клик как бы получился отложенным во времени. Для третьего клика это уже не проходит. Т.е. к примеру так: дабл клик на дверь - она открывается и сразу же закрывается, как если бы ты на нее кликнул. Но для двери все нормально, а вот для некоторых активаторов нет. В чем тут дело?
В написанном мной скрипте активатор кликом приводится в действие. Однако если быстро кликнуть два раза, то после завершения цепочки действий и установки переменной снова в 0, вся цепочка начинается заново, хотя ты не кликал. А по логике такого происходить не должно (onActivate = 0). Как будто второй клик запоминается и отсылается вперед во времени (причем как будто даже на любое время, именно на длительность цепочки) и в момент конца цепочки активируется. В общем мистика какая-то) Вот схематический вид скрипта.
begin
short var
if ( var == 0 )
if ( onActivate == 1 )
set var to 1
endif
endif
;далее цепочка действий
if ( var == 1 )
rotate, x 10
set var to 2
endif
if ( var == 2 )
move, z -10
set var to 3
endif
if ( var == 3 )
set Other_object.var to 1
set var to 0
endif
end
Т.е. совершенно ничего особенного, движение предметов, установка флаговых переменных в других объектах - ничего связанного с анимацией персонажей. Наверное это связано с движком, но все же у меня возник вопрос, может где-то тут есть ошибка, которую я не уловил?
Наконец-то я понял в чем дело!!! (год спустя, см. дату предыдущего поста)))
Если, скажем так, к условию onActivate доступ ограничен, тогда запрос этого условия как бы откладывается на время, до тех пор, пока проверка этого условия снова не станет доступна. Вот, например, есть активатор и по умолчанию он бездействует, ждет, пока мы на него кликнем. Но вот мы кликнули на него, и он начал что-то делать, но пока еще не закончил и не вернулся к своему обычному положению, а мы уже снова кликнули. Этот второй клик не найдет в данный момент условия onActivate, хотя в скрипте оно есть, и в результате клик как бы отложится в память, будет ждать того момента, когда это условие снова станет доступным, и тогда-то отложенный клик сработает мгновенно. В игре это выражается в том, что мы кликнули, заработало, мы снова кликнули, ничего естественно не произошло, так как и не должно, а вот как только прекратилась работа, то сразу же начинается снова, хотя мы не кликали. Неприятная штука. Для большей ясности вот скрипт.
begin scr_test
short State
if ( State == 0 );первый клик разумеется здесь
if ( onActivate == 1 )
set State to 1
endif
elseif ( State == 1 )
;...тут какие-то действия активатора, но потом значение State снова станет равно 0
;второй раз кликнули тут (нам достаточно времени, пока работает активатор)
;но здесь нет условия onActivate, и запрос условия как бы запоминается
endif
end
Вот как это можно исправить. Конечно, если самосрабатывание активатора не особенно тревожит, можно и не париться. Но все же.
begin scr_test
short State
if ( State == 0 );первый клик разумеется здесь
if ( onActivate == 1 )
set State to 1
endif
else
if ( onActivate == 1 )
;условие есть и тут, но оно пустое
;запрос найдет его, но ничего не произойдет
;в результате повторного срабатывания не будет
endif
if ( State == 1 )
;...действия активатора
endif
endif
end
Проблему можно решить и поменяв местами уровни State и onActivate, но тогда цепочка if-elseif для State разрывается...
begin scr_test
short State
if ( onActivate == 1 )
if ( State == 0 )
set State to 1
endif
endif
if ( State == 1 )
;...действия активатора
endif
end
И еще хочу отметить, что, к счастью, запросы, не находящие условия onActivate, не выстраиваются в очереди. Т.е. нет такого, что 3 раза кликнул когда State == 1, а потом 3 раза на автомате сработало. К счастью, только 1 раз.