Отправить пакет до того как подключится игрок

Версия Minecraft
1.7.10

tox1cozZ

aka Agravaine
8,455
598
2,892
Нужно отправить данные сервера клиенту до того как он еще подключился. То есть пока до он не получил данные, он не приконектится.
Пробовал хукнуться вот тут(NetHandlerLoginServer) и отправить свой пакет(майновский), но кидает нулл из-за того что он не зареган в EnumConnectionState.
ScreenShot_20181207063136.png
Есть идеи?
 
Последнее редактирование:
7,099
324
1,510
А что ты пытаешься сделать? Авторизацию?
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Не. На сервере есть конфиг, который он должен отсылать клиенту. Но так как у меня IEEP инициализируется по этим настройкам, то нужно чтобы клиент уже их имел перед созданием игрока.
Не, можно канеш добавить проверок всяких, но это как-то не оч.
 
7,099
324
1,510
Но так как у меня IEEP инициализируется по этим настройкам, то нужно чтобы клиент уже их имел перед созданием игрока
может, просто сделать IEEP изменяемым и сетать значения уже после создания IEEP, а в самом начале делать их совершенно чистыми?
 
1,038
57
229
Какое странное ты выбрал решение, а почему бы моду не скачивать его по http (или через launcher)?
 
Последнее редактирование:
1,111
47
420
хоба! netty-боги вливаются в тред!
чтож у тебя есть 2 варианта: один костыльный другой хук))00
1) Майн использует нетти(шок). Майн использует TCP(шок х2). Netty использует pipeline(шок х3). Netty pipeline состоит из хэндлеров обрабатывающих сообщение шаг за шагом. Так например в майнсруфте 1.7.10 пайплайн без учета легаси дичи и прочей не важной херни на выходе состоит из энкодера, препендера и шифровщика (препендер это дичь которая 3 пакета сжимает в один). Так вот, я когда поднимал нетти на муйне 1.6.4 дабы не ломать существующую систему шифрования придумал до ужаса противный, но рабочий костыль: я перехватываю пакет с публичным ключом в энкодере (штукенция которая превращает объект типа Packet в массив байт) и достаю из него ключ который затем использую в том же энкодере для шифрования пакетов. Мое предложение: добавить в pipeline нового подключения твой офигительный хэндлер которым ты можешь отлавливать пакеты логина и что то по этому поводу предпринимать. Например отсылать другой пакет который будет ловить твой же хэндлер, но на стороне клиента.
Небольшая тонкость заключается в том что исходящие пакеты идут по пайплайну в обратном порядке. Так например если пайплайн будет 1 2 3, то исходящие пройдет по хэндлерам в порядке 3 2 1.
Так вот, что бы добавить свой хэндлер тебе нужно добыть channel у которого вызвать метод getPipeline(). В случае с NetHandlerLoginServer он лежит в объекте NetworkManager который лежит в поле field_147333_a. Соответственно чтобы добавить свой хэндлер юзаешь ф-ию Pipeline#addLast. Рекомендую использовать ChannelOutboundHandlerAdapter.
Чтобы твой код сработал для каждого нового подключения предлагаю добавить еще один хэндлер в главный канал который собственно принимает все новые подключения. Создается он в NetworkSystem.
Удачи!
2) Вставить хук перед вызовом конструктора пакета логина
 
Сверху