Сообщений: 78
Тем: 16
Зарегистрирован: Mar 2013
Репутация:
143
Жаль, что я почти ничего не понял((
Мои умозаключения: При входе персонажа внутриигровое серверное время и время на карте (внутриигровое клиентское) практически идентичное, разница всего в минуту-три (внутриигровых). Но после большого времени в онлайне эти два показателя расходятся, сервер "убегает" вперед от клиента.
Т.к. при входе серверное время отсылается в клиент - это все реализовано. Я так понял, не хватает периодической синхронизации серверного и клиентского времени, например раз в 15-30мин.
Можно использовать те же пакеты отправки времени от сервера клиенту при входе персонажа, отправляя их раз скажем в 15 минут тем самым синхронизировать время? Где примерно/точно может находится код отправки данного пакета в ядре сервера?
Сообщений: 64
Тем: 3
Зарегистрирован: Feb 2017
ntking Написал:Жаль, что я почти ничего не понял((
Мои умозаключения: При входе персонажа внутриигровое серверное время и время на карте (внутриигровое клиентское) практически идентичное, разница всего в минуту-три (внутриигровых). Но после большого времени в онлайне эти два показателя расходятся, сервер "убегает" вперед от клиента.
Т.к. при входе серверное время отсылается в клиент - это все реализовано. Я так понял, не хватает периодической синхронизации серверного и клиентского времени, например раз в 15-30мин.
Можно использовать те же пакеты отправки времени от сервера клиенту при входе персонажа, отправляя их раз скажем в 15 минут тем самым синхронизировать время? Где примерно/точно может находится код отправки данного пакета в ядре сервера?
:obamafacepalm:
Тебе человек именно это и предоставил, все по полочкам разложив что куда и где менять.
Код:
@Override
protected void execute() throws Throwable {
if(clientTime != GameTimeController.getInstance().getGameTime() || clientTimescale != GameTimeController.getInstance().getTimescale())
sendPacket(ClientSetTime.STATIC_PACKET);
}
Вот собственно сам пакет.
А вот его отправка
Если прошло какое то время
Код:
ThreadPoolManager.getInstance().scheduleGeneralAtFixedDelay(this::refreshClients, TimeUnit.HOURS.toMillis(1), TimeUnit.HOURS.toMillis(1));
Отправляем
Код:
public void refreshClients() {
WorldManager.getInstance().getMainWorld().getAllPlayers().stream()
.forEach(player -> player.sendPacket(RequestTimeCheck.getInstance()));
Смотри где у тебя в сборке определяется scheduleGeneralAtFixedDelay (или что-то подобное с задержкой по времени) , и пихай туда, главное чтобы это был глобальный обработчик, а не под что-то отдельное.