MaiorPainЗдравствуйте. Подскажите, пожалуйста: как в боевом скрипте дождаться окончания проигрываемой анимации.
Обязательно ли запускать анимацию в отдельном потоке, или можно запускать её в основном?
Идея боя такая, что при ходе юнита, юнит накладывает на случайный стек игрока слепоту. Необходимые проверки на применимость вызваны до вызова этой функции. Проблема в том, что получается ситуация, когда юнит двигается, потом анимация движения прерывается, он начинает анимацию каста, и анимация каста прерывается не закончившись анимацией атаки, если юнит изначально планировал атаковать стек игрока.
Вот код используемых функций:
function Cast(unit, target)
combatSetPause(not nil);
CastBlindForFree(unit, target);
playAnimation(target, 'hit', ONESHOT_STILL);
table.insert(blind_array, target);
combatSetPause(nil);
return not nil
end
function CastBlindForFree(caster, target)
SetUnitManaPoints(caster, 100);
local mana_before_cast = GetUnitManaPoints(caster);
repeat sleep(1) until(GetUnitManaPoints(caster) == 100);
UnitCastAimedSpell(caster, SPELL_BLIND, target);
sleep(4);
SetUnitManaPoints(caster, mana_before_cast);
repeat sleep(1) until(GetUnitManaPoints(caster) == mana_before_cast);
end
Другими словами именно логика отрабатывает корректно, а как синхронизировать анимации, чтобы они проигрывались последовательно, а не основные игровые анимации прерывали анимацию каста.
Большое спасибо за уделённое время и внимание к прочтению вопроса, будут благодарен за информацию.
while combatReadyPerson() == nil do sleep(1) end
Данный код "спит" пока ход не принадлежит никакому существу: в момент старта боя или во время проигрывания анимации. Если не поможет, то тогда только через ожидание, но стоит учитывать что sleep() в боевом скрипте отличается от аналога на карте приключений. Аргумент sleep() должен исчисляться сотнями чтобы выдать хоть какую-то видимую задержку в боевом скрипте