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
Пока что думаю...
 
1. Просто не делай кнопку закрытия, т.е. не обнуляй скрин
2. Если ты хочешь, что бы это GUI сохранялось даже при перезаходе - делай атрибутом или IExtendedEntityProperties'ом, гайдик можешь найти в ресурсах, там по ссылке полный есть.
3. Это не точно, но просто получаемый дамаг делай 0
4. как надумаешь - напишешь)
 
1. Да, можно просто убрать keyTyped. Но лучше все таки в апдейте проверять, что если игрок не залогинен и не открыт гуи ввода пароля - открывать. То есть даже если он как-то его и закроет, то он сразу же снова откроется.
2. Отправь пакет игроку, отсчитывай время. Если через 15 секунд не приходит ответ - он либо не ввел код, либо ушел с сервера. Ну и просто кикать.
 
Смысл подобной защиты в том, что пока игрок не подтвердил PIN-код (если у него он конечно установлен) - максимально исключить любые взаимодействия игрока с миром и мира с игроком.
Неправильно делать это так. Игрок может взаимодействовать с миром с открытым гуи(естественно, с доп модификациями клиента)
Нужно отменять события взаимодействия, а также не давать игроку смещаться, пока клиент не отправил пакет с корректным пином
 
А давайте так. Заходит игрок на сервер, ему приходит пакет что мол так и так нужно ввести пин-код, потом его кикает с сервера, и тут открывается гуи ввода пин-кода. Когда он жмякает ввод мы снова пытаемся подключится и первым делом отсылаем пакет с введенным пин-кодом, сервер его проверяет и исходя из правильности мы либо возвращаемся к началу либо все ок))
 
А если у игрока большой пинг или клиент зависает при входе? Он просто будет не успевать отправить пакет с pin-кодом
 
Так или иначе ты отправишь пакет первой партией так что сработать должно)) Можно кикать игрока на второй нетворк тик хотя думаю это не понадобится))
 
Всем привет, знаю, что тема слегка старовата, но всё же она не была закрыта и вопрос не был до конца решен. Собственно вариант выше мне понравился и я хотел бы взяться за его реализацию.

Я попытаюсь наиболее подробно описать то, как я вижу эту систему и те моменты, где у меня возникают вопросы.

1. Мы клиент. Выбрали из списка серверов сервер и нажали подключиться.

2. Мы сервер. Услышали, что входит игрок. Загрузили на него данные из бд, посмотрели, включён ли у него включен пин-код, если да - отправили пакет клиенту с просьбой ввести пин-код и кикнули его.

3. Мы клиент. Нас кикнули и мы вместе с киком получили пакет, в котором нам сказали показать GUI для ввода пин-кода. Мы отметили это в переменной `needShowGui как true` и когда мы услышим на клиенте событие "PlayerLoggedOutEvent" (из-за кика с сервера или я не правильно подобрал событие?) и если переменная `needShowGui == true` покажем GUI для ввода пин-кода. Далее, мы типо введём в GUI пин-код, нажмём кнопку. Сохраним введённый пин-код в переменную, чтобы потом отправить его пакетом на сервер при следующем входе на сервер.

Вот здесь несколько вопросов:
3.1 Цитата: "cнова пытаемся подключится на сервер" - имеется ввиду сам игрок пытается или автоматически модом подключаемся на последний сервер, на который заходили? Если да, то как это сделать и как запомнить сервер, на который последний раз заходили?
3.2 Цитата: "первым делом отсылаем пакет с введенным пин-кодом". На какой стадии это нужно сделать, чтобы это можно было назвать "первым делом"?
К примеру мы решили все вопросы выше и подключаемся на сервер и попутно отправляем пакетом введённый пин-код..

4. Мы сервер. Мы слышим, что игрок входит на сервер и одновременно получаем пакет. Как не запутаться здесь? Как не кикнуть игрока раньше, чем его пакет будет обработан? Идём дальше. Если же игрок ввёл правильный пин-код, то мы оставляем его в покое и отправляем клиенту информацию о том, что пин-код был успешно введён, чтобы скинуть ту самую переменную `needShowGui`, для того чтобы не вылезло окно GUI для ввода пин-кода при выходе с сервера или просто вручную обнулять её при каждой отправки пакета с пин-кодом на false? Допустим, что разобрались мы ответным пакетом и той переменной. В случае, если пин-код окажется не верный? Снова посылаем пакет с просьбой ввести пароль и кикаем игрока? И так по кругу?

Пока это все вопросы. Что я упустил, что я делаю не правильно? Чем плох этот способ, кроме того, что написали выше? Прошу меня поправить.
 
А почему бы не вводить пин-код при каждом входе (примерно на уровне выбора сервера)? Плюс, всегда можно добавить опцию "Сохранить пин-код".

На какой стадии это нужно сделать, чтобы это можно было назвать "первым делом"?
Точно не знаю, нужно тестить. Есть ивент ClientConnectedToServerEvent. Но не уверен есть ли уже в этот момент на сервере объект игрока.
Но если что, ты всегда можешь с сервера послать запрос на пин-код в ивенте PlayerLoggedInEvent

Этот ивент вылетает только на сервере.

Как не кикнуть игрока раньше, чем его пакет будет обработан?
Заведи в игроке флажок isAuthed и кикай игрока, если !isAuthed && player.tickExists > N
 
А почему бы не вводить пин-код при каждом входе (примерно на уровне выбора сервера)? Плюс, всегда можно добавить опцию "Сохранить пин-код".
Но если у человека нет пин кода?
имеется ввиду сам игрок пытается или автоматически модом подключаемся на последний сервер, на который заходили?
Мод пытается конечно.
Если да, то как это сделать и как запомнить сервер, на который последний раз заходили?
Цитирую тебя же
Java:
  private void func_146791_a(ServerData serverdata)
    {
        FMLClientHandler.instance().connectToServer(this, serverdata);
    }
Цитата: "первым делом отсылаем пакет с введенным пин-кодом". На какой стадии это нужно сделать, чтобы это можно было назвать "первым делом"?
ClientConnectedToServerEvent
Идём дальше. Если же игрок ввёл правильный пин-код, то мы оставляем его в покое и отправляем клиенту информацию о том, что пин-код был успешно введён, чтобы скинуть ту самую переменную `needShowGui`, для того чтобы не вылезло окно GUI для ввода пин-кода при выходе с сервера или просто вручную обнулять её при каждой отправки пакета с пин-кодом на false? Допустим, что разобрались мы ответным пакетом и той переменной. В случае, если пин-код окажется не верный? Снова посылаем пакет с просьбой ввести пароль и кикаем игрока? И так по кругу?
Это уже на тебе. Как хочешь так и делай.
Мы сервер. Мы слышим, что игрок входит на сервер и одновременно получаем пакет. Как не запутаться здесь? Как не кикнуть игрока раньше, чем его пакет будет обработан?
Кикнуть на следующий network тик.
 
Заведи в игроке флажок isAuthed и кикай игрока, если !isAuthed && player.tickExists > N

Аналогично вопросу выше: вы имеете ввиду дать пакету "время(
Код:
player.tickExists > N
)" для дешифровки на сервере и применению(
Java:
setAuth(true)
) к сессии игрока. Я не понимаю как правильно ему дать это время.
 
Не проще ли сохранять этот самый пинкод модификатором или нбт в энити плеера и от туда доставать? Я у себя так сделал многое) (Мана, опыт, уровни, деньги, фракции...)

И если Pin != null, то отправляем пакет открытия гуи где нам дает 15 секунд (в тиках) и если нет, то юзаешь ивент выхода с сервера.
 
Назад
Сверху