Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Время сервера "/time" не совпадает с картой
#1
Какое-то время работы сервера эти 2 времени совпадают, потом в какой-то нехороший момент внутриигровое время, отображаемое на карте начинает разниться с временем, отображаемым командой /time. Отсюда все вытекающие: день/ночь, Закен, Хеллбонд/Шадай и т.д.
Из-за чего может разниться время и можно ли поставить какую-то патчину, которая будет синхронизировать время на карте и реальное серверное, например раз в полчаса?

В конфиге есть такая вот строчка:
Код:
# Интервал сохранения игрового времени (в секундах)
SaveGameTimeInterval = 120

Сборка Phenix/Open-Team.

P.S. Извините, если уже было и я плохо искал.
Ответ
#2
Видимо в коде нет синхронизации внутригрового времени, нужно сделать что-то вроде этого:
Код:
...
        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()));
    }

Ну и сами пакеты:
Код:
package ru.catssoftware.gameserver.network.serverpackets;

import lombok.Getter;

/**
* @author PointerRage
*
*/
public class RequestTimeCheck extends L2GameServerPacket {
    private final static String PINFO = "[S] RequestTimeCheckPacket (cd)";
    @Getter private final static RequestTimeCheck instance = new RequestTimeCheck();
    
    private RequestTimeCheck() {
    }

    @Override
    protected void write() throws Throwable {
        writeC(0xBB);
        writeD(0x00); //?
    }
    
    @Override
    public String getType() {
        return PINFO;
    }
}

Опкод 0x97 (в интерлюде, в других версиях смотрите сами), ингейм стейт.
Код:
package ru.catssoftware.gameserver.network.clientpackets;

import fork2.gs.time.GameTimeController;
import ru.catssoftware.gameserver.network.serverpackets.ClientSetTime;

/**
* @author PointerRage
*
*/
public class SendTimeCheck extends L2GameClientPacket {
    private final static String PINFO = "[C] 0x97 SendTimeCheckPacket (cdd)";
    private int clientTime;
    private int clientTimescale;
    
    @Override
    protected void read() throws Throwable {
        clientTime = readD();
        clientTimescale = readD();
    }

    @Override
    protected void execute() throws Throwable {
        if(clientTime != GameTimeController.getInstance().getGameTime() || clientTimescale != GameTimeController.getInstance().getTimescale())
            sendPacket(ClientSetTime.STATIC_PACKET);
    }
    
    @Override
    public String getType() {
        return PINFO;
    }

}

Код:
/*
* This program is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package ru.catssoftware.gameserver.network.serverpackets;

import fork2.gs.time.GameTimeController;

public class ClientSetTime extends L2GameServerPacket {
    private static final String _S__F2_CLIENTSETTIME = "[S] 0xEC ClientSetTime [cdd]";
    public static final ClientSetTime STATIC_PACKET = new ClientSetTime();

    private ClientSetTime() {
        
    }

    @Override
    protected final void write() {
        writeC(0xec);
        writeD(GameTimeController.getInstance().getGameTime()); // time in client minutes
        writeD(GameTimeController.getInstance().getTimescale());
    }

    @Override
    public String getType() {
        return _S__F2_CLIENTSETTIME;
    }
}
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Ответ
#3
Жаль, что я почти ничего не понял((
Мои умозаключения: При входе персонажа внутриигровое серверное время и время на карте (внутриигровое клиентское) практически идентичное, разница всего в минуту-три (внутриигровых). Но после большого времени в онлайне эти два показателя расходятся, сервер "убегает" вперед от клиента.
Т.к. при входе серверное время отсылается в клиент - это все реализовано. Я так понял, не хватает периодической синхронизации серверного и клиентского времени, например раз в 15-30мин.
Можно использовать те же пакеты отправки времени от сервера клиенту при входе персонажа, отправляя их раз скажем в 15 минут тем самым синхронизировать время? Где примерно/точно может находится код отправки данного пакета в ядре сервера?
Ответ
#4
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 (или что-то подобное с задержкой по времени) , и пихай туда, главное чтобы это был глобальный обработчик, а не под что-то отдельное.
Ответ
#5
Не предупредил, что с программированием у меня все туго, но решение все же мне удалось наваять (осторожно, индийский код!):
Код:
            int gameTime = GameTimeController.getInstance().getGameTime();
                int h = gameTime / 60 % 24;
                int m = gameTime % 60;
                if(m >= 3 && m <= 9)
                {
                for(L2Player player : L2ObjectsStorage.getAllPlayersForIterate())
                    {
                    player.sendPacket(new ClientSetTime());
                    }
                }
Я нашел сервис, который с промежутком во времени проверяет себя на запущенность каждые 2 минуты ну и засунул туда свой код. Время синхронизации выставил внутриигровое, каждый час (получение часов и минут уже было в коде). В сервис пришлось импортировать:
Код:
import gameserver.model.L2Player;
import gameserver.model.L2ObjectsStorage;
import gameserver.serverpackets.ClientSetTime;
Всем спасибо за желание помочь!
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  время баффов, клиент с3 tpls 4 2,990 05-12-2024, 03:34 AM
Последний пост: Magican
  Ошибка запуска гейм сервера Kensiro 1 1,873 01-23-2018, 04:41 PM
Последний пост: PROGRAMMATOR
  Правка Fortress Siege Time KateKate7912 9 2,810 01-08-2016, 02:05 AM
Последний пост: KateKate7912
  Баф и тп во время боя. Mois 0 1,144 11-20-2015, 02:05 AM
Последний пост: Mois
  Настройка сервера AndSrt 3 1,673 11-03-2015, 12:00 AM
Последний пост: Deeez
  Ошибка в логах игрового сервера KateKate7912 6 1,886 10-13-2015, 07:52 AM
Последний пост: KateKate7912
  время для java Valent 7 2,400 08-15-2015, 10:13 PM
Последний пост: Bacek
  Синхронизация координат клиента и сервера awers 5 2,903 11-03-2014, 12:05 AM
Последний пост: linliss
  Скрипт установки сервера не работает. Linux /. SunWar 2 1,408 08-24-2014, 06:48 PM
Последний пост: SunWar
  ядро сервера frozen pyworld 5 1,663 11-13-2013, 07:24 PM
Последний пост: [STIGMATED]

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)