В New World недавно произошла ошибка, которая вызвала некоторые предположения о том, как работает наша симуляция. Ошибка была устранена быстро, но и предположение, и ошибка заслуживают некоторой ясности в объяснении.

New World не является авторитетным клиентом — с точки зрения симуляции New World полностью основан на сервере. На высоком уровне модель такова: клиенты отправляют входные данные контроллера на сервер, а затем сервер проверяет эти входные данные на предмет ограничений, которые могут сделать их недействительными, а затем, если они приняты, использует их в качестве входных данных для персонажа («актер» — это наше внутреннее имя ) в памяти сервера. Затем выполняются правила физики и игры (полностью на стороне сервера), а результат отправляется обратно исходному клиенту. Затем клиенты будут рисовать результат, определенный сервером.

Возьмем, к примеру, игрока, размахивающего топором, чтобы рубить дерево. Для игрока они нажимают кнопку, и топор раскачивается, что может показаться очень ориентированным на клиента. То, что происходит на самом деле, гораздо сложнее. Игрок нажимает кнопку, на сервер отправляется сообщение, в котором говорится: «Я нажал кнопку для взмаха», и в то же время клиент начинает рисовать визуальное изображение размахивания топора на дисплее игрока — эта часть строго графическая и не имеет никакого отношения к моделированию. Сервер даже не знает об этом графическом представлении и не слышит никакой информации, кроме самого нажатия кнопки.

Когда входные данные достигают сервера, он проверяется, возможно ли это, а затем сервер начинает анимацию полностью серверной версии «скелета» для персонажа с замахом. Это не аппроксимация или версия ограничивающего объема скелета, она на самом деле полностью детализирована, полностью анимирована, поэтому мы можем иметь такую ​​точность, что если топор едва задевает дерево, это согласуется между сервером и тем, что клиент воспринимает как возможное. Если в результате этой полностью серверной анимации топор пересекает дерево, то этот результат отправляется обратно клиенту или возвращается ошибка. Важно отметить, что только после того, как сервер выполнил анимацию и в результате топор пересек дерево, это считается успешным. Мы не сокращаем и не вычисляем это грубо, мы делаем полную детализацию физики для всех таких действий. Получив результат, будь то попадание или промах, клиент настроит свое визуальное отображение в соответствии с тем, что определил сервер. Мы используем здесь несколько уловок на стороне клиента, чтобы «растянуть» анимацию, пока клиент ожидает ответа сервера, но результат всегда основан только на ответе сервера. Тот же самый образец применяется в бою и других взаимодействиях симуляции физики.

У нас была ошибка, при которой при определенных обстоятельствах мы ждали на стороне сервера ввода от клиента перед обработкой результатов. В сочетании с преднамеренным эффектом оружия, который допускает кратковременную неуязвимость, это создало ситуацию, когда игроки могли достичь состояния неуязвимости и продлить его, заставив клиента не реагировать, даже если клиент не имеет права голоса в нанесении урона (как урон, создаваемый игроком, так и полученный урон игроком вычисляются на стороне сервера на основе результатов моделирования физики плюс правила игры). Это была особенно серьезная ошибка, учитывая нашу серверную симуляцию, и мы приносим извинения за это. Мы исправили ошибку в коде в тот же день, когда узнали о ней, затем протестировали, чтобы убедиться, что в результате этих изменений не произошло ничего непредвиденного, и сразу же опубликовали исправление.

Там также есть очевидные ошибки, которые мы исправляем, с точки зрения ограничения скорости и контроля действий, чтобы битва оставалась доступной для игры. Однако ни в коем случае клиенты не принимают решений или не «замораживают» персонажей на месте — если персонаж заморожен, это происходит из-за того, что клиент отстает от рисования, но симуляция сервера продолжается.