Форум HeroesWorld-а - Показать сообщение отдельно - Скрипты
Тема: Скрипты
Показать сообщение отдельно
#3854
Старый 28.05.2023, 20:53
  #3854
^
Долгий
 
Аватар для Долгий
📖
Регистрация: 23.04.2019
Сообщения: 94
Регистрация: 23.04.2019
Сообщения: 94
По умолчанию
Re: Скрипты

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() должен исчисляться сотнями чтобы выдать хоть какую-то видимую задержку в боевом скрипте
Долгий вне форума
Ответить с цитированием