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

Agravaine

Золотая лига
Сообщения
3,489
Лучшие ответы
94
Симпатии
253
#1
Версия Minecraft
1.7.10
Подтверждение
Я максимально подробно описал проблему, включая исходный код файлов, краш лог, изображения и другую информацию, которая может помочь пользователям форума решить мой вопрос!
Нужно отправить данные сервера клиенту до того как он еще подключился. То есть пока до он не получил данные, он не приконектится.
Пробовал хукнуться вот тут(NetHandlerLoginServer) и отправить свой пакет(майновский), но кидает нулл из-за того что он не зареган в EnumConnectionState.
ScreenShot_20181207063136.png
Есть идеи?
 
Последнее редактирование:

Agravaine

Золотая лига
Сообщения
3,489
Лучшие ответы
94
Симпатии
253
#4
Не. На сервере есть конфиг, который он должен отсылать клиенту. Но так как у меня IEEP инициализируется по этим настройкам, то нужно чтобы клиент уже их имел перед созданием игрока.
Не, можно канеш добавить проверок всяких, но это как-то не оч.
 

hohserg1

Золотая лига
Сообщения
2,994
Лучшие ответы
71
Симпатии
185
#5
Но так как у меня IEEP инициализируется по этим настройкам, то нужно чтобы клиент уже их имел перед созданием игрока
может, просто сделать IEEP изменяемым и сетать значения уже после создания IEEP, а в самом начале делать их совершенно чистыми?
 

ZZZubec

Каменная лига
Сообщения
73
Лучшие ответы
1
Симпатии
2
#6
Какое странное ты выбрал решение, а почему бы моду не скачивать его по http (или через launcher)?
 
Последнее редактирование:

Dahaka

Золотая лига
Сообщения
2,263
Лучшие ответы
79
Симпатии
234
#7
А зачем тебе IEEP перед созданием игрока? Не могу представить ситуации, когда это вот прям необходимо.
 

JustAGod

Железная лига
Сообщения
729
Лучшие ответы
39
Симпатии
172
#8
хоба! 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) Вставить хук перед вызовом конструктора пакета логина
 

Agravaine

Золотая лига
Сообщения
3,489
Лучшие ответы
94
Симпатии
253
#9
Спасибо)
А что хук даст? Я не понял)
 

JustAGod

Железная лига
Сообщения
729
Лучшие ответы
39
Симпатии
172
#10
я не сказал В конструкторе, я сказал Перед.
Ты достигнешь ровно того же эффекта, что и с хендлером, но тебе не придется разбираться с нетти.
 
Сверху