Tivemos esse problema com alguns CCGs online nos quais trabalhei. Melhor solução que já vi:
1) Os jogadores DEVEM se conectar ao servidor, e não diretamente um ao outro, e NUNCA deve passar endereços IP dos oponentes nos dados que transmitir aos jogadores. Isso evita ataques de negação de serviço em que um jogador força o oponente offline para a vitória.
2) Conexão derrubada = você perde, o oponente vence. Devemos assumir que, se você caiu, foi uma queda para evitar certas perdas.
3) As desconexões tentam se reconectar por um período de tempo, para que um ligeiro soluço líquido não o force a perder sem culpa sua. Idealmente, o tempo é longo o suficiente para permitir que alguém se reconecte se acidentalmente chutar o cabo, mas curto o suficiente para que o oponente não fique frustrado e adormeça enquanto espera. Acho que achamos que 45 a 60 segundos pareciam corretos.
4) Permita que os jogadores denunciem seus oponentes. Este é um conjunto necessário para impedir que alguém encontre uma maneira irritante de contornar sua política. Por exemplo, talvez seja tão verbalmente abusivo que o oponente caia apenas para sair de lá, ou se desconecte e reconecte continuamente para prolongar a duração do jogo, ou fique paralisado para evitar uma perda ou qualquer outra coisa. Você não pode impedir TODO o mau comportamento, mas pode incluir um mecanismo no jogo para denunciá-lo e deixar o departamento de suporte ao cliente cuidar do resto.
Eu tive que resolver esse problema uma vez em um jogo de corrida on-line, onde jogadores que estavam perdendo costumavam desligar seus consoles para evitar que a perda aparecesse em seus registros. No entanto, isso se aplica muito bem a qualquer situação de PvP.
Minha solução foi assim:
No início da partida, quando todos os jogadores se juntarem e o jogo estiver prestes a começar, calcule qual seria o resultado se o jogador perder a partida. Em nosso jogo de corrida, 'perdido' significa 'ficou em último lugar' e o resultado usual seria 'menos N pontos do ranking dos jogadores'.
Salve o resultado em um local seguro (Savegame, placar, área de dados on-line, etc.).
Junto com o resultado, armazene um sinalizador 'GameStarted'. Isso apenas significa que o jogo começou. Precisamos disso mais tarde.
Quando o jogo terminar, calcule o resultado real e aplique-o à pontuação / estatísticas dos jogadores. Desative o sinalizador 'GameStarted'. Este é o processo normal de conclusão do jogo.
No entanto, se o jogador desconectar, puxar o cabo ou desligar, eventualmente eles voltarão ao menu de jogos. No código do menu, fazemos uma verificação do sinalizador 'GameStarted'. Se estiver definido, temos certeza de que detectamos uma desconexão no jogo anterior. Podemos então aplicar o resultado armazenado na pontuação / estatísticas dos jogadores. Será o mesmo que se o jogador perdesse o jogo. Também é uma boa idéia colocar um alerta informando o jogador do que está acontecendo. Então, quando ele perceber que há consequências para se desconectar no meio do jogo, você verá que o comportamento começa a mudar.
fonte
Eu acho que a única maneira de conseguir isso seria uma questão de estrutura do seu jogo. Existem duas maneiras de tornar a trapaça menos desejável: punição ou recompensa. Portanto, se você não quer punição adversa, pense em maneiras de recompensar o jogador que não caiu.
Em vez de a recompensa de PvP ser o saque do corpo do conquistado (o que torna a queda muito ruim), a vitória concede uma recompensa como exp., Ouro ou algo totalmente diferente (Classificação dos Pontos?). Se um dos jogadores é expulso, o jogador restante recebe a recompensa e o jogador que foi expulso não ganha nada, mas perde nada. A menos que seja um sistema de classificação, nesse caso, o jogador que sair poderá perder alguns pontos no ranking.
fonte
O Lineage II faz assim:
Pessoalmente, eu faria da mesma forma, apenas permitindo que os jogadores pré-definam as ações que seu personagem está realizando ao desconectar-se (fique e lute, corra para a zona segura mais próxima, evitando o aggro, use uma rolagem regular de fuga, use uma rolagem abençoada de escape, ...) e os personagens persistem no mundo do jogo, mesmo que o jogador não esteja logado.
fonte
Quem desconectado morrerá assim que for esfaqueado o suficiente, e o outro será creditado pela morte. Qualquer coisa mais branda será explorada.
Geralmente, existe um cronômetro de 1 a 5 minutos antes que seu corpo deixe o mundo.
fonte
Não há como determinar o que causou a desconexão (a energia foi desligada? Eu enfureci minha máquina contra uma parede?), Então você pode apenas assumir que o usuário está tentando (ou tentaria) trapacear e torná-lo vulnerável por X minutos.
fonte
A maneira como isso é tratado pelo EVE Online é a seguinte:
O navio começa a se empenar 15 segundos após a desconexão. Se for deformado, o navio não se deforma. (O navio do seu personagem começará a "fugir" após 15 segundos, a menos que seja "preso" por outro jogador)
O temporizador PVP (tempo até o jogador "fugir" durante o combate PvP) é definido como 3 minutos. (Isso serve para combater vários outros temporizadores).
O temporizador do NPC permanece em 1 minuto, mas o navio se deforma após 15 segundos, a menos que o NPC seja distorcido.
Quando um navio é alvo bloqueado pelo jogador, ele deve mudar para o temporizador pvp (para combatê-lo usando o temporizador de 1 minuto, se desconectar em circunstâncias em que não é alvo até o cronômetro ser definido).
fonte
Se você tiver uma maneira de modelar os padrões habituais dos jogadores em batalha, poderá enviá-los para o modo AI até que reconectem ou a batalha termine, o que ocorrer primeiro. Mas não lhes dê recompensas (exp, itens etc.) pela batalha, a menos que retornem em X por um período de tempo.
fonte
Eu implementaria algum tipo de histerese. Você pode usar a cenoura e o palito. Mas escolher qual usar pode ser baseado no histórico (você também pode fazer uma análise da conexão e da "capacidade de vitória" atual e usá-la.). É assim que você faria pessoalmente, esperançosamente. Modelo simples:
Você pode abusar sim. Mas fazer isso pode exigir mais esforço do que apenas morder a bala. (Se levar 2 CDs ruins, por exemplo, você pode tecnicamente se livrar de metade de suas perdas. Mas isso atenua alguns abusos e, no caso de jogadores menos inteligentes, todos abusam).
Concedido usando isso significa que os placares não serão somados a 100%. Desde que você pode DC enquanto bom e não gravar uma perda. Mas o outro bom jogador pode registrar uma vitória. Além disso, não somar 100% significa que 2 jogadores podem cooperar, desligando o jogador DC para ganhar vitórias.
Portanto, não é infalível, mas a análise bayesiana adicionada da conexão gamestate + provavelmente poderia detectar funkiness e tornar esse esquema à prova de balas. (Você pode derrotar a análise bayesiana, mas os humanos não são bons em fazer isso e a matemática está fora do alcance da maioria das pessoas, sem mencionar o investimento de tempo para "preparar" uma luta para superar o fato de DC estar bem).
fonte