Skip to content

Docs: Time

Kit Oliynyk edited this page Oct 13, 2021 · 1 revision

Время

Внутреннее время определяется через пульсы, секунды (и интервалы по нескольку секунд), минуты. Все периодические процессы, происходящие в мире, сконфигурированы происходить в один из этих фиксированных интервалов.

Пульс

Минимальная единица игрового времени. Длина пульса задается через поле Dreamland::pulsePerSecond.

Note: Как и некоторые другие временные интервалы, это значение можно переопределить в файле /etc/dreamland.xml.

В настоящее время один пульс равен четверти секунды, 250 ms. Это позволяет всем, у кого длина пинга до хостинга меньше этого значения, быть в равных условиях по вводу и очередности обработки команд. Те, у кого пинг хуже, получаются в более невыгодном положении.

В каждый пульс происходи один 'тик' планировщика задач (DLScheduler::tick). В частности, каждый пульс выполнится:

  • вычитка входящих команд от игроков с учетом wait state (файл plug-ins/iomanager/iomanager.cpp, метод ioRead)
  • обработка команд игроков (там же)
  • обновление параметров здоровье/мана/шаги (файл plug-ins/updates/update_param.cpp)
  • один виток основного цикла авто-обновлений из старой Анатолии (файл plug-ins/updates/update.cpp)
    • агрессия мобов
    • обновление счетчиков для других периодических действий
  • отправка результатов (вывод) игрокам (метод IOManager::ioWrite)
  • автосохранение базы данных языка Fenia
  • обработка HTTP-запросов (файл src/io/socketmanager.cpp, метод run).

Переполнение пульса

Иногда все действия, которые должны произойти за пульс, не укладываются в 250 ms, и тогда в логах можно увидеть сообщение Pulse overflow. Например, если на этот пульс выпало сохранение чего-то тяжелого на диск или сложные автономные действия мобов, или перегрузка плагинов, такое переполнение легко может наступить. Эта ситуация, хоть и случается редко, может привести к накоплению погрешности, поэтому секунда внутренего времени не будет равна секунде реального, а игровой час (см. ниже) не идеально равен одной минуте.

Секунда

Примерно равна одной секунде реального времени (с поправкой на переполнение пульса).

Здесь и далее, если не указано иначе, периодические действия определены в файле plug-ins/updates/update.cpp.

Баттл-тик (боевой раунд)

Боевой раунд равен 3м секундам (12 пульсам) и определен в поле DreamLand::pulseViolence. В боевой раунд выполняется:

  • один раунд ударов у сражающихся персонажей (multi_hit)
  • триггер onFight на персонажах и предметах
  • обновление ловушек (триггер onDive на комнатах)
  • мобы автоматически вступают в бой для помощи другому мобу (auto-assist)

Авто-действия мобов (mobile round)

Автономные действия мобов происходят каждые 4 секунды (16 пульсов) и определены в поле DreamLand::pulseMobile. В этот момент, например, происходит вызов Феневых триггеров onSpec.

Тик (игровой час)

Тик примерно равен одной минуте (с поправкой на переполнение пульса). Раз в минуту происходит:

  • обновление погоды
  • обновление календаря (проходит один игровой час)
  • обновление всех персонажей и мобов (character update)
    • аффекты уменьшают длительность или снимаются
    • обновляется голод и жажда
    • увеличивается счетчик бездействия (idle) на игроке
    • зеркала разбиваются, фонари мигают и т.д.
    • вызов тригера onArea на персонажах и мобах
  • обновление всех предметов
    • аффекты уменьшают длительность или снимаются
    • вызов тригера onArea на предметах
    • тикает timer предметов
    • предметы тают, разбиваются, исчезают по истечению таймера и т.д.

Другие периодические действия

раз в 4 секунды

  • плавание (и утопление) предметов на поверхности воды (water float)

раз в 6 секунд

  • автосохранение предметов в комнате и мобов на диск (room saving)
  • один шаг моба, идущего по следу (track update)

раз в 12 секунд

  • действие аффектов на комнатах (заражение чумой от black death и так далее)

раз в 45 секунд

  • один раунд аукциона (plug-ins/anatolia/act_hera.cpp)

раз в 110 секунд

  • попытка сброса арии (plug-ins/updates/update_areas.cpp)
Clone this wiki locally