Пересылка тиков и задержка сети

Версия Minecraft
1.7.10
1,159
38
544
Здарова народ. Я делаю систему кулдаунов и у меня возникла необходимость пересылать их на клиент, чтобы красиво рендерить. Как я могу синхронизировать тики кулдауна сервера и клиента так, чтобы они декрементировались с одинаковой скоростью на обоих сторонах? Пока я себе слабо представляю как сделать такое.

И что насчет подводных камней? Что если сервер будет перегружен и начнем сыпать "cant keep up" и начнет пропускать тики? Должен ли я в таком случае отнять от кулдаунов пропущенные тики?

Заранее благодарю тех, кто поделится со мной полезной мыслёй.
 
Решение
Кстати, народ, если уж на то пошло - можно пересылать не реальное время, а время мира - getTotalWorldTime(). И строить кулдаун на нем. Он всегда одинаков на клиенте и на сервере, выше написал почему.
Но там та же проблема - можно переждать кулдаун в оффлайне. Если это критично - не подойдёт.

mayakplay

SpringFlomaster
217
3
160
разным на клиенте и на сервере
И?)

Я бы взял серверное время применения способности, прибавив к нему время, которое кулдаунится скилл, запрещая использовать его, пока systemTime !> того числа, которое получилось. Как решать эту штуку на клиенте - дело фантазии, но можно использовать и похожий принцип)
 

tox1cozZ

aka Agravaine
8,456
598
2,893
Дак блен. У сервера время например 10. Плюс кулдаун 2. Отсылаем клиенту 12.
У клиента время 8. Ему пришло что конец в 12. 12 - 8 = 4, а на сервере 2. То есть анимация кулдауна на клиенте будет в два раза дольше и игрок будет думать что скилл еще в откате, хотя он уже закончился.
Ну и само собой время обычно отличается не на пару секунд, а на пару часов может или дней, если в системе стоит кривое время. Вот и получаем что анимация ваще работать не будет.

Я сказал как лучше сделать... Отослать при установке кулдауна его время, а на клиенте отсчитывать. Тогда если уж клиент на секунду и подлагнет - ничего страшного.
 
2,505
81
397
И?)

Я бы взял серверное время применения способности, прибавив к нему время, которое кулдаунится скилл, запрещая использовать его, пока systemTime !> того числа, которое получилось. Как решать эту штуку на клиенте - дело фантазии, но можно использовать и похожий принцип)
Не, так не делается. Игрок сможет переждать кулдаун в оффлайне. А в одиночке дак вообще на паузе.

Я делал двумя способами.
Как советует Агрованя, т.е. сервер просто устанавливает кулдаун, а декрементят обе стороны. Если вдруг клиент закончил сильно раньше, то то при попытке заюзать скилл, сервер обновит кулдаун на клиенте. Также сервер уберет кулдаун на клиенте, когда закончит. На клиенте тоже могут быть лаги.
И второй способ это первый плюс дополнительная синхронизация с определенным периодом.
 
1,159
38
544
Зачем каждый тик пересылать, если можно пересылать количество тиков кулдауна при его установке
Я это и имел ввиду. Пересылать по тику каждый тик (какое забавное словоблудие) - это отстой.

Тики - слишком нестабильная херотовина,
Что значит "нестабильная"? Какой критерий стабильности?

Тогда если уж клиент на секунду и подлагнет - ничего страшного.
Дык костылина же. Прикинь если бы такое в вовке было бы - игроки с ума посходили бы.

Если вдруг клиент закончил сильно раньше, то то при попытке заюзать скилл, сервер обновит кулдаун на клиенте.
Видеть как скилл без кулдауна откатывается на некоторое время назад будет очень не здорово.

Товарищи, а как делается подобная точная синхронизация в самой игре? Например время суток? Только не говорите что там просто шлется один инт и все.
 

mayakplay

SpringFlomaster
217
3
160

tox1cozZ

aka Agravaine
8,456
598
2,893
Товарищи, а как делается подобная точная синхронизация в самой игре? Например время суток? Только не говорите что там просто шлется один инт и все.
Так и делается. Время плюсуется и на клиенте и на сервере, но сервер дополнительно раз в секунду шлёт клиенту свое время, чтобы не было рассинхрона. Сделай тоже самое и все, по сути мы тебе это и посоветовали.
 

tox1cozZ

aka Agravaine
8,456
598
2,893
Кстати, народ, если уж на то пошло - можно пересылать не реальное время, а время мира - getTotalWorldTime(). И строить кулдаун на нем. Он всегда одинаков на клиенте и на сервере, выше написал почему.
Но там та же проблема - можно переждать кулдаун в оффлайне. Если это критично - не подойдёт.
 
1,159
38
544
можно переждать кулдаун в оффлайне
Ну так так и делается обычно. А для противоположное поведение достигается легко. Не вижу проблемы.

В общем я теперь шлю не количество тиков, которые нужно отсчитать. А TimeStamp начала и конца кулдауна. Благодаря синхрону TotalWorldTime я теперь могу не переживать о задержке сети (во всяком случае пока).
 
Сверху