У нас была эта проблема с некоторыми онлайн CCG, над которыми я работал. Лучшее решение, которое я видел:
1) Игроки ДОЛЖНЫ подключаться к серверу, а не друг к другу напрямую, и вы НИКОГДА не должны передавать IP-адреса оппонентов в данных, которые вы передаете игрокам. Это предотвращает атаки типа «отказ в обслуживании», когда игрок вынуждает своего противника отключиться для победы.
2) Разорванная связь = вы проигрываете, оппонент выигрывает. Мы должны предположить, что если вы уронили, это был урон, чтобы избежать определенных потерь.
3) Разъединяет попытку переподключения в течение некоторого времени, так что небольшой сбой в сети не заставит вас проиграть не по своей вине. В идеале время должно быть достаточно продолжительным, чтобы позволить кому-то восстановить соединение, если он случайно ударил по кабелю, но достаточно коротким, чтобы противник не расстроился и не заснул во время ожидания. Я думаю, что мы нашли, что приблизительно 45 - 60 секунд чувствовали себя хорошо.
4) Разрешить игрокам сообщать о своих противниках. Это необходимая ловушка, чтобы никто не нашел раздражающий способ обойти вашу политику. Например, может быть настолько словесно оскорбительным, что оппонент падает, просто чтобы выбраться оттуда, или постоянно отключаться и повторно подключаться, чтобы растянуть продолжительность игры, или бросать камни, чтобы избежать проигрыша, или что-то еще. Вы не можете остановить ВСЕ плохое поведение, но вы можете включить внутриигровой механизм, чтобы сообщить об этом, а затем позволить отделу поддержки клиентов обработать все остальное.
Однажды мне пришлось решать эту проблему в гоночной онлайн-игре, в которой проигравшие игроки часто выключали свои приставки, чтобы избежать проигрыша в своих записях. Однако это очень хорошо подходит для любой ситуации PvP.
Мое решение пошло так:
В начале матча, когда все игроки присоединились и игра началась, подсчитайте, каков будет результат, если наш игрок проиграет матч. В нашей гоночной игре «потерянный» означает «занял последнее место», а обычным результатом будет «минус N очков от рейтинга игрока».
Сохраните результат в безопасном месте (Savegame, таблица лидеров, область данных онлайн и т. Д.).
Вместе с результатом сохраните флаг «GameStarted». Это просто означает, что игра началась. Нам это понадобится позже.
Когда игра закончится, рассчитайте фактический результат и примените его к счету / статистике игроков. Снимите флажок «GameStarted». Это нормальный процесс завершения игры.
Однако, если игрок отключается, тянет за кабель или выключается, в конечном итоге он вернется в меню игр. В коде меню мы проверяем флаг «GameStarted». Если он установлен, мы уверены, что мы обнаружили отключение в игре от ранее. Затем мы можем применить сохраненный результат к счету / статистике игроков. Это будет так же, как если бы игрок проиграл игру. Это также хорошая идея, чтобы поставить предупреждение, информирующее игрока о том, что происходит. Затем, как только он увидит, что есть последствия для отключения в середине игры, вы увидите, что поведение начинает меняться.
источник
Я думаю, что единственный способ справиться с этим - это вопрос структуры вашей игры. Есть два способа сделать обман менее желательным: наказание или вознаграждение. Поэтому, если вы не хотите наказания, подумайте о способах вознаграждения игрока, который не бросил.
Вместо награды от PvP за добычу тела побежденного (что делает выпадение очень плохой вещи), сделайте выигрыш, чтобы получить некоторую награду, такую как опыт, золото или что-то еще полностью (Очки? Рейтинг?). Если один из игроков удален с поля, то оставшийся игрок получает вознаграждение, а игрок, которого ударили, ничего не получает, но ничего не теряет. Если это не система ранжирования, в этом случае уходящий игрок может потерять несколько очков ранжирования.
источник
Lineage II делает это так:
Лично я сделал бы это аналогично, только позволил бы игрокам заранее определять действия, которые их персонаж выполняет при разъединении (оставайтесь и сражайтесь, бегите в ближайшую безопасную зону, избегая агрессии, используйте обычный свиток побега, используйте благословенный свиток бежать, ...) и пусть персонажи сохранятся в игровом мире, даже если игрок не вошел в систему.
источник
Тот, кто отключился, умрет, как только ему будет нанесен достаточный удар, а другой будет зачислен за убийство. Все более снисходительное будет эксплуатироваться.
Обычно есть таймер от 1 до 5 минут, прежде чем ваше тело покинет мир.
источник
Невозможно определить, что вызвало отключение (отключилось ли питание? Я в ярости бросил машину на стену?), Поэтому можно только предполагать, что пользователь пытается (или попытается) обмануть и сделать их уязвимыми на Х минут.
источник
Способ, которым это обрабатывается EVE Online, заключается в следующем:
Корабль начинает активировать варп через 15 секунд после отключения. Если он деформирован, корабль не исчезнет. (Корабль вашего персонажа начнет «убегать» через 15 секунд, если он не «пойман в ловушку» другим игроком)
Таймер PVP (время, пока игрок «убегает» во время боя в PvP) установлен на 3 минуты. (Это для противодействия ряду других таймеров).
Таймер NPC остается на 1 минуте, но корабль исчезает через 15 секунд, если только NPC не скремблирует варп.
Когда корабль заблокирован игроком, он должен переключиться на таймер PvP (чтобы противостоять ему, используя таймер 1 мин, если он отключается при обстоятельствах, когда он недоступен до тех пор, пока не установлен таймер).
источник
Если у вас есть способ моделирования обычных паттернов игроков в битве, вы можете отправить их в режим ИИ, пока они не переподключатся или битва не закончится, в зависимости от того, что наступит раньше. Но не давайте им никаких наград (опыта, предметов и т. Д.) За битву, если они не вернутся за X времени.
источник
Я бы реализовал какой-то гистерезис. Вы можете использовать морковь и палку. Но выбор того, что использовать, может быть основан на послужном списке (вы также можете сделать анализ их связи и текущей «выигрышной способности» и использовать это). Надеюсь, вы будете делать это лично. Простая модель:
Вы можете злоупотреблять этим да. Но для этого может потребоваться больше усилий, чем просто укусить пулю. (Например, если потребовалось 2 ДК, чтобы стать плохим, вы могли бы технически избавиться от половины своих потерь. Но это смягчает некоторые злоупотребления, а в случае менее умных игроков - все злоупотребления).
Использование этого означает, что табло не будет составлять 100%. Так как вы можете DC, пока хорошо, а не записывать потери. Но другой хороший игрок может записать победу. Также не суммирование до 100% означает, что 2 игрока могут сотрудничать, отключая DC игрока, чтобы выиграть стек.
Так что не надежный, но добавленный байесовский анализ соединения gamestate + может, вероятно, обнаружить фанки и сделать эту схему пуленепробиваемой. (Вы можете победить байесовский анализ, но люди не умеют это делать, и математика недоступна для большинства людей, не говоря уже о временных затратах на «прокачку» боя, чтобы с DC все было в порядке).
источник