PIN-code

Версия Minecraft
1.7.10
224
5
28
На данный момент имеется плагин дополнительной защиты аккаунтов - PIN-код. Если у игрока установлен PIN-код, то при входе в игру его телепортирует в специальный мир, где стоит приват WG, которые не позволяет делать практически ничего кроме как ввести PIN-код и у него есть 15 секунд, чтобы ввести PIN-code иначе он будет кикнут. так же там реализована система возвращения на последнюю локацию, от куда игрок был телепортирован из мира для ввода PIN-кода.

Я хочу это сделать ввиде мода, и исключить этот ненужный контроль локаций, но для этого мне нужно полностью исключить взаимодействие игрока с миром и мира с игроком, поэтому меня возник ряд вопросов:

Игрок входит на сервер, сервер проверяет, установлен ли у этого игрока PIN-код и если да - посылает ему пакет, который прикажет моду на стороне клиента показать GUI для ввода.

Вопрос #1
Пакет был принят клиентом, требуется показать GUI для ввода PIN-кода, но такое, чтобы его нельзя было закрыть. Как это сделать?


Вопрос #2
Пакет был отправлен клиенту, но ничего в ответ не приходит. Конечно возможно игрок просто вышел/был кикнут, а может он всё таки как то смог закрыть GUI. К примеру если игрок закрыл GUI можно отправить пакет о том, что GUI было закрыто и если игрок до сих пор не был авторизован, то кикнуть его. Т.е. предусмотреть момент, если попытаются обойти GUI.


Смысл подобной защиты в том, что пока игрок не подтвердил PIN-код (если у него он конечно установлен) - максимально исключить любые взаимодействия игрока с миром и мира с игроком.

Вопрос #3
Любые дамаги можно отменить - это легко. Еда? Я думаю в Forge есть эвент, где меняется еда и его можно отменить. Ходить игрок вроде как не сможет, так как у него будет включён GUI. Что ещё? Смысл в том, чтобы предусмотреть и отменить любые попытки взаимодействия с игроком. Так же сюда относится к примеру если игрока начнёт передвигать вода - на стороне клиента слушать событие движения и отменять его, если моду ещё не пришла информация о том, что игрок успешно авторизовался?


Вопрос #4
Пока что думаю...
 
TickEvent.ServerTickEvent Тики на сервер.
TickEvent.ClientTickEvent Тики на клиенте.
TickEvent.WorldTickEvent Тики в мире.
TickEvent.PlayerTickEvent Тики игрока.
TickEvent.RenderTickEvent Тики рендера.

Я так понимаю мой выбор - ServerTickEvent ?
 
Короче, проблема господа. Сделал все нужные GUI, работа с бд, сделал отправку пакета с требованием ввести пин код если у игрока он включён. В PlayerLoggedInEvent я проверяю включён ли у игрока пин код, если да - отправляю пакет и кикаю его. Клиент получает пакет и поверх получает пакет кика, которое перекрывает окно ввода пин кода, но это ладно в GuiOpenEvent с этим разобрался. Дальше всё по плану - ввод пин кода, нажатие кнопки и чё дальше? Конекнт на сервер. Без проблем. Ввели пин код, нажали. В ClientConnectedToServerEvent пытаюсь отправить пакет - не успевает. ЗАТО сервер успевает кикнуть игрока с той же просьбой о вводе пин кода. Короче, проблема в том, что не удаётся реализовать отправку пакета с клиента на сервер с введённым пин кодом. Что посоветуете?
 
и чё дальше? Конекнт на сервер.
А что если кул хацкер при коннекте (без пинкода) прилепит коннект, как будто с пин кодом?
Код говно, удаляй. (Права на данную фразу принадлежат Dahaka)
 
А что если кул хацкер при коннекте (без пинкода) прилепит коннект, как будто с пин кодом?
Код говно, удаляй. (Права на данную фразу принадлежат Dahaka)
Такого варианта у клиента нет. Клиент вводит только пин-код, включён он у него или выключен контролируется сервером и только.
 
Поддерживаю Doc'a. Опытный человек и кодер спокойно может декомпилировать, пошаманить с классом пакетов и попросту не открывать данное гуи. Это в пример.
 
Ну судя по тому, что ты пишешь - кикаешь на сервере, а все остальное делает на клиенте..
 
Не цитируйте предыдущее сообщение, если вы отвечаете на него целиком, а не на его часть
Ну судя по тому, что ты пишешь - кикаешь на сервере, а все остальное делает на клиенте..
Всё, что делает клиент - это вводит пин код в в текстовое поле по запросу. Всё. При следующем заходе на сервер, если клиент снова получает пакет на ввод пин кода отправляется в ответ уже подготовленный пакет с введённым пином при пришлом вводе и, конечно обнуляется.
Ну а вот примерно происходит ожидание пакета от клиента с пин кодом.
Заведи в игроке флажок isAuthedи кикай игрока, если !isAuthed && player.tickExists > N
 
Смысл в пин-коде, если есть пароль. Или его нет?
сервер успевает кикнуть игрока с той же просьбой о вводе пин кода
Так сделай вторую задержку дольше. И вообще всегда сделай долгую задержку перед киком
 
Так сделай вторую задержку дольше. И вообще всегда сделай долгую задержку перед киком
Не канает, за время пока игрока не кикнет его могут убить или ещё чего.

Всё таки нужно попытаться отправить пакет до join эвента. Сейчас буду пробовать это: [1.7.10] How to send a message to server during ClientConnectedToServerEvent
 
Господа, хелпуйте.

4й день уже сижу, пытаюсь, но не получается реализовать.

Задумка была в том, чтобы на событии входа игрока на сервере чекнуть включён ли у него пин код, если да - отправить пакет клиенту и кикнуть с сервера. Там типо клиенту вылезет GUI, он введёт пин код и по нажатию на кнопку произойдёт подключение к последнему серверу и отправка пакета. Пакет с сервера я отправил, кикнул. До клиента он дошёл. GUi открылось. Игрок вводит пин код но я не могу отправить пакет с ним раньше, чем игрок будет кикнут на сервере. Делать задержку не вариант, ибо пока будет "ожидание пакета с пин кодом" с игроком могут что-либо сделать, от чего смысл данной системы теряется. Есть у кого то варианты?

Мне подсказал один человек по поводу усыпления async треда конекта игрока, но фордж не предоставляет к нему доступ.
 
Сделай вообще отдельный сервис для приема пакетом с пин-кодами
 
Есть класс net.minecraft.network.packet.Packet1Login. Го в него всунем пин-код и его проверку на сервере.
Это до ужаса простой вариант, но к сожалению он требует знания ASM(9 Можно наверно как то закостылить используя либу фолкена.

Мне уже даже немного совестно что я везде хожу и размахиваю асмом, но щас я сурьезно не вижу варианта более красивого. С другой стороны я пониаю что мало кто шарит в этом и с третьей стороны я понимаю что мне крайне влом писать код за других. Сижу и тихо себя ненавижу(9
 
Назад
Сверху