Tuvimos este problema con algunos CCG en línea en los que trabajé. La mejor solución que he visto:
1) Los jugadores DEBEN conectarse al servidor, no entre ellos directamente, y NUNCA debe pasar las direcciones IP de los oponentes en los datos que transmite a los jugadores. Esto evita los ataques de denegación de servicio en los que un jugador obliga a su oponente a desconectarse para ganar.
2) Conexión caída = pierdes, el oponente gana. Debemos suponer que si cayó, fue una caída para evitar cierta pérdida.
3) Desconecta el intento de reconectarse por un período de tiempo, de modo que un pequeño inconveniente neto no te obligue a perder sin culpa tuya. Idealmente, el tiempo es suficiente para permitir que alguien se vuelva a conectar si accidentalmente pateó el cable, pero lo suficientemente corto como para que el oponente no se frustre y se quede dormido mientras espera. Creo que encontramos que entre 45 y 60 segundos se sintieron bien.
4) Permitir a los jugadores informar a sus oponentes. Este es un requisito general para evitar que alguien encuentre una forma molesta de su política. Como, tal vez ser tan verbalmente abusivo que el oponente cae solo para salir de allí, o desconectarse y reconectarse continuamente para estirar la duración del juego, o obstaculizar para evitar una pérdida, o lo que sea. No puede detener TODO mal comportamiento, pero puede incluir un mecanismo en el juego para informarlo y luego dejar que su departamento de atención al cliente se encargue del resto.
Tuve que abordar este problema una vez en un juego de carreras en línea donde los jugadores que perdían a menudo apagaban sus consolas para evitar que la pérdida apareciera en sus registros. Sin embargo, se aplica muy bien para cualquier situación PvP.
Mi solución fue así:
Al comienzo del partido, una vez que todos los jugadores se hayan unido y el juego esté por comenzar, calcule cuál sería el resultado si nuestro jugador pierde el partido. En nuestro juego de carreras, 'perdido' significa 'llegó en último lugar' y el resultado habitual sería 'menos N puntos del rango de los jugadores'.
Guarde el resultado en una ubicación segura (Savegame, tabla de clasificación, área de datos en línea, etc.).
Junto con el resultado, almacene una bandera 'GameStarted'. Esto solo significa que el juego ha comenzado. Lo necesitaremos más adelante.
Cuando el juego se complete, calcule el resultado real y aplíquelo a la puntuación / estadísticas de los jugadores. Desmarca la bandera 'GameStarted'. Este es el proceso normal de finalización del juego.
Sin embargo, si el jugador se desconecta, tira de su cable o se apaga, eventualmente volverán al menú de juegos. En el código del menú, verificamos el indicador 'GameStarted'. Si está configurado, estamos seguros de que hemos detectado una desconexión en el juego de antes. Luego podemos aplicar el resultado almacenado a la puntuación / estadísticas de los jugadores. Será lo mismo que si el jugador perdiera el juego. También es una buena idea poner una alerta informando al jugador de lo que está sucediendo. Luego, una vez que vea que hay consecuencias por desconectarse a mitad del juego, verá que el comportamiento comienza a cambiar.
fuente
Creo que la única forma de lograr esto sería una cuestión de la estructura de tu juego. Hay dos formas de hacer que la trampa sea menos deseable: castigo o recompensa. Entonces, si no quieres un castigo adverso, piensa en formas de recompensar al jugador que no cayó.
En lugar de que la recompensa de PvP sea el botín del cuerpo del conquistado (lo que hace que dejar caer una cosa muy mala) haga que ganar otorgue alguna recompensa como exp., Oro o algo completamente diferente (¿Puntos? Clasificación?). Si uno de los jugadores es expulsado, el jugador restante recibe la recompensa y el jugador que fue expulsado no gana nada pero no pierde nada. A menos que sea un sistema de clasificación, en cuyo caso el jugador que se vaya podría perder algunos puntos de clasificación.
fuente
Lineage II lo hace así:
Personalmente, lo haría de manera similar, solo permitiría a los jugadores predefinir las acciones que su personaje está tomando en la desconexión (quedarse y luchar, correr a la zona segura más cercana evitando el aggro, usar un desplazamiento regular de escape, usar un desplazamiento bendito de escapar, ...) y hacer que los personajes persistan en el mundo del juego incluso si el jugador no está conectado.
fuente
El que se desconectó morirá una vez que sea apuñalado lo suficiente, y el otro será acreditado por el asesinato. Cualquier cosa más indulgente será explotada.
En general, hay un temporizador de 1 a 5 minutos antes de que su cuerpo abandone el mundo.
fuente
No hay forma de determinar qué causó la desconexión (¿se cortó la alimentación? ¿Lancé furiosamente mi máquina contra una pared?), Por lo que solo puede suponer que el usuario está intentando (o intentaría) hacer trampa y hacerlos vulnerables por X minutos
fuente
La forma en que EVE Online maneja esto es la siguiente:
La nave comienza a engancharse 15 segundos después de la desconexión. Si la urdimbre está revuelta, la nave no se deformará. (La nave de tu personaje comenzará a "escapar" después de 15 segundos, a menos que esté "atrapada" por otro jugador)
El temporizador PVP (tiempo hasta que el jugador "huye" mientras está en combate PvP) se establece en 3 minutos. (Esto es para contrarrestar una serie de otros temporizadores).
El temporizador de la APN permanece en 1 minuto, pero la nave se deforma después de 15 segundos a menos que la APN revuelva la deformación.
Cuando un barco tiene el objetivo bloqueado por el jugador, debe cambiar al temporizador pvp (para contrarrestarlo usando el temporizador de 1 minuto si se desconecta en circunstancias en las que no es objetivo hasta que se establece el temporizador).
fuente
Si tienes una forma de modelar los patrones habituales de los jugadores en la batalla, puedes enviarlos a un modo AI hasta que se vuelvan a conectar o la batalla termine, lo que ocurra primero. Pero no les des ninguna recompensa (exp, artículos, etc.) por la batalla a menos que regresen en X cantidad de tiempo.
fuente
Implementaría algún tipo de histéresis. Puedes usar la zanahoria y el palo. Pero elegir cuál usar se puede basar en el historial (también puede hacer un análisis de su conexión y "habilidad para ganar" actual y usar eso). Es como lo harías en persona con suerte. Modelo simple:
Puedes abusarlo sí. Pero hacerlo podría requerir más esfuerzo que solo morder la bala. (Si tomara 2 DCs para ser malo, por ejemplo, técnicamente podría deshacerse de la mitad de sus pérdidas. Pero mitiga algunos abusos y, en el caso de jugadores menos inteligentes, todos los abusos).
De acuerdo con esto, significa que los marcadores no sumarán el 100%. Ya que puede DC mientras está bien y no registrar una pérdida. Pero el otro buen jugador puede registrar una victoria. Además, no sumar el 100% significa que 2 jugadores pueden cooperar apagando al jugador DC para acumular victorias.
Por lo tanto, no es infalible, pero el análisis bayesiano agregado de gamestate + conexión probablemente podría detectar el funkiness y hacer que este esquema sea a prueba de balas. (Puede derrotar el análisis bayesiano, pero los humanos no son buenos para hacer esto y las matemáticas están fuera del alcance de la mayoría de las personas, sin mencionar la inversión de tiempo para "preparar" una pelea para que DC esté bien).
fuente