Войти или зарегистрироваться

Помогите Версия протокола игрока

  • Автор темы Автор темы ReloGGrc
  • Дата начала Дата начала

ReloGGrc

Активный участник
Пользователь
Баллы
46
Имя в Minecraft
ALis
Всем здрасте, и так, как же все таки получить версию протокола игрока? Где она хранится или если нигде не хранится, то в какой момент подключения игрока ее можно отловить? (Я распологаю всем отправляемыми и принимаемыми пакетами в своем плагине). Касательно фичи в Paper ядрах, в NetworkManager есть поле protocolVersion но оно все равно возвращает значение протокола сервера, касательно PacketHandshakingInSetProtocol, там тоже значение версии протокола сервера.
Касательно ViaVersion(в целом суда отнесем и ProtocolLib, ProtocolSupport), да, я знаю что с помощью его API можно получить версию протокола игрока, но меня это не интересует(Даже не смотря на то, что на сервера без него с других версий и не зайдешь)

Памагити)
 
В Handshake должно быть в любом случае. Если тестируешь с ViaVersion, вполне возможно, что он подменяет значение.
А вообще, конечно, не понимаю, зачем занимаешься этим.
 
Та так, нужно) Касательно handshake, посмотри класс, там в самом конструкторе значение протокола берется из SharedConstants
 
handshake, посмотри класс, там в самом конструкторе значение протокола берется из SharedConstants
Куда смотреть то? NMS под рукой не имею, если речь об этом. Сужу чисто по протоколу, и здесь версия явно имеется. В Velocity тоже на Handshake ловится версия протокола.
 
Конструктор пакета PacketHandshakingInSetProtocol, где b - версия протокола, и тут он берется не у игрока, а из SharedConstants..

Код:
public PacketHandshakingInSetProtocol(String address, int port, EnumProtocol intendedState) {
    this.b = SharedConstants.b().getProtocolVersion();
    this.c = address;
    this.d = port;
    this.e = intendedState;
  }
 
Конструктор пакета PacketHandshakingInSetProtocol, где b - версия протокола, и тут он берется не у игрока, а из SharedConstants..

Код:
public PacketHandshakingInSetProtocol(String address, int port, EnumProtocol intendedState) {
    this.b = SharedConstants.b().getProtocolVersion();
    this.c = address;
    this.d = port;
    this.e = intendedState;
  }
Сбилдил, и по-моему, ты не тот конструктор читаешь.
upload_2023-4-7_20-50-7.png
 
Да, хотел уже написать, ты прав касательно ViaVersion, то что он подменяет циферку на ту, которая собсна нужна чтоб игрок вошел, теперь вопрос, как мне цапнуть это циферку раньше...
 
Да, хотел уже написать, ты прав касательно ViaVersion, то что он подменяет циферку на ту, которая собсна нужна чтоб игрок вошел, теперь вопрос, как мне цапнуть это циферку раньше...
Могу лишь посоветовать почитать исходники, или спросить напрямую в дискорде. Но правда не понимаю, в чем трудность использовать API от Via...
 
Ладно, разеберусь, в любом случае спасибо!)
 
Протокол игрока и не может быть отличным от протокола сервера. На сервера разрешён вход лишь с одним значением протокола.
Поэтому очевидно, что если нужно получить версию игрока, то нужно обращаться к плагинам, предоставляющим мультиверсию - в данном случае ViaVersion. Т.е. нужно использовать апи этого плагина.

В теории можно и на уровне пакетов, но в этом случае ты будешь детектить даже те подключения, которые могут и не завершиться реальным подключением. Если, например, версия клиента выше или ниже поддерживаемой ViaVersion. Или если игрок банально в бане.
Помимо этого, на разных версиях разный протокол - придется делать поддержку всех возможных вариаций пакетов (благо их не так много), а также добавлять поддержку при выходе новых версий.
Поэтому не вижу ни единой причины использовать этот вариант вместо апи ViaVersion.

Но если он установлен на прокси-сервере по типу банжи или велосити, то версию на сервере не получить вовсе. Но это и не проблема ViaVersion, просто важная деталь
 
Ну, Я не понял как мне перехватить пакет раньше чем ViaVerdion, поэтому сделал иначе, если на сервере присутствует ViaVerdion, то использую его, если нет, то беру сам из пакета значение, добавляю в мапу на 15 секунд, и если в течении этого времени игрок подключился, беру значение из мапы, если нет - удаляю.
Пока хоть так
 
Ну, Я не понял как мне перехватить пакет раньше чем ViaVerdion, поэтому сделал иначе, если на сервере присутствует ViaVerdion, то использую его, если нет, то беру сам из пакета значение, добавляю в мапу на 15 секунд, и если в течении этого времени игрок подключился, беру значение из мапы, если нет - удаляю.
Пока хоть так
Возможно при отсутствии ViaVersion проще получить версию протокола сервера. Но не уверен, что это реально сделать рефлексией
 
Можно, класс SharedConstants содержит ее, только вот не на всех версиях, на низких нету(точно не помню на каких)
 
Назад
Верх