-
Notifications
You must be signed in to change notification settings - Fork 15
Docs: Time
Внутреннее время определяется через пульсы, секунды (и интервалы по нескольку секунд), минуты. Все периодические процессы, происходящие в мире, сконфигурированы происходить в один из этих фиксированных интервалов.
Минимальная единица игрового времени. Длина пульса задается через поле 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)
Автономные действия мобов происходят каждые 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
)