¿La detección de colisión se debe realizar en el lado del servidor o de forma cooperativa entre el cliente / servidor?

24

Estoy trabajando en un juego en línea que tendrá un procesamiento de detección de colisión muy pesado. Los modelos de jugadores colisionarán con otros jugadores, mobs, estructuras, terrenos y objetos sólidos que solo existen en el lado del servidor (no almacenados en los archivos de datos del cliente).

Por razones de seguridad, ¿debo hacer todas las detecciones de colisión del lado del servidor? ¿O debería hacer que el cliente haga la detección y que el servidor realice un seguimiento de alguna manera? Siento que será demasiado para que el servidor lo haga solo (estoy diseñando el motor para cientos de jugadores en un servidor).

¿Alguien sabe cómo lo hacen los MMO convencionales? Sé que casi todos los MMO en este momento son susceptibles a ataques físicos y usualmente los solucionan detectando ataques y prohibiendo personas. Prefiero que los hacks no funcionen en absoluto, al menos para el componente de física.

BarakatX2
fuente

Respuestas:

21

Parece que la respuesta obvia es hacer la mayor parte de su detección del lado del cliente (por suavidad), y luego interpola a lo que dice el servidor si su cliente está demasiado lejos. El servidor marcará a una frecuencia menos frecuente que el cliente (como, digamos, 10hz), y probablemente necesitará tener un código básico de "¿puede este jugador haber llegado a donde dice que actualmente es de su última ubicación conocida", lo que implica algún tipo de solución de tipo nav mesh y pathfinding.

Eso podría ser prohibitivamente lento dependiendo de cuáles sean sus necesidades. Puede tomar una decisión de diseño, por ejemplo, no preocuparse por la colisión jugador-jugador en el servidor. La mayoría de los juegos, que yo sepa, ni siquiera se preocupan por eso en el cliente. Realmente depende de cuáles sean sus necesidades.

Pero la regla general es que nunca debes confiar en el cliente. Si afecta el juego, al menos debes verificarlo en el servidor.

Tétrada
fuente
24

Entonces, algunas respuestas aquí.

  • La colisión del lado del cliente es ideal desde el punto de vista del rendimiento y desde el punto de vista del jugador. No quieres que la colisión sea lenta, quieres que los jugadores se encuentren con un objeto sólido y se detengan. Si lo haces en el lado del servidor, estás viendo jugadores de bandas de goma por todas partes o dando a los jugadores un retraso notable cuando intentan moverse. Mal mojo, en ambos casos.

  • La colisión del lado del servidor es ideal desde el punto de vista de la seguridad. Cuanto más se acerquen sus clientes a las "terminales tontas", menos explotable será su juego. Hay una razón por la que nadie que juegue un MUD basado en texto tiene que preocuparse por los wallhacks o speedhacks: es porque el cliente no está haciendo nada que valga la pena mencionar.

  • Hacer ambas cosas es "ideal" en casi todos los casos. Deje que los clientes hagan lo suyo, luego verifique dos veces en el servidor para asegurarse de que las personas no estén haciendo trampa. Los inconvenientes son la complejidad, la sincronización (¿qué haces exactamente si los dos no están de acuerdo?) Y el uso absoluto de la CPU del servidor.

  • Lo que recomiendo es hacerlo casi por completo del lado del cliente. El cliente tiene autoridad sobre su posición, al igual que en un sistema completo del lado del cliente, y realiza todo su propio procesamiento. Además de eso, al azar el servidor verifica a varios jugadores de vez en cuando. Mantenga baja la carga del servidor, pero esto eliminará a los tramposos sorprendentemente rápido.

Alternativamente, hágalo del lado del cliente por ahora, agregue la verificación del lado del servidor en algún momento en el futuro si su juego se vuelve lo suficientemente popular como para que la gente lo engañe. Lo cual, seamos honestos, probablemente no lo hará, por lo que no tiene sentido gastar el tiempo del codificador en este momento.

ZorbaTHut
fuente
3

World of Warcraft no hace detección de colisión entre jugadores / mobs. Puede haber o no razones técnicas detrás de esta decisión, pero realmente, esto tiene que ser más una decisión de diseño del juego que una decisión técnica:

Imagine lo explotable que podría ser en situaciones de jugador contra jugador. ¡O qué difícil sería usar el banco / casa de subastas / buzones si otros jugadores (a menudo inactivos) bloquearan su movimiento!

En cuanto a la detección de colisiones basada en cliente vs servidor, realmente, a menos que el movimiento sea muy lento, tiene que ser principalmente del lado del cliente, por lo que se ve bien para cada cliente. La respuesta de colisión lenta / retardada, y / o colisionar con objetos 'invisibles' sería bastante desagradable.

bluescrn
fuente
1
Aunque la pregunta no es si la colisión jugador contra mafia / jugador es un mal diseño del juego, sugeriría mirar juegos como Darkfall Online donde todo es sólido. Agrega una nueva dimensión al juego y te permite hacer cosas muy interesantes con el juego. No me preocuparía que los jugadores bloqueen cosas como bancos en mi juego porque siempre habrá una pequeña brecha donde los jugadores pueden ver para abrir el objeto.
BarakatX2
Podría hacer que los jugadores sean bloqueados por cualquier cosa que pueda atacar y cualquier cosa que no puedan atacar, simplemente pueden caminar. Por ejemplo, los jugadores no podrían caminar a través de las multitudes ya que pueden atacar a las multitudes. Tampoco podrían caminar a través de los jugadores mientras están marcados para PVP ya que están marcados PVP. Un jugador que no esté marcado con PVP podría atravesar a cualquier jugador, incluso aquellos que no estén marcados con PVP, porque no pueden atacar a esos jugadores.
Azaral
2

Si te preocupan los hacks y eso tiene un gran impacto en el juego, entonces la respuesta es SÍ.

En mi juego basado en navegador que es un tipo de juego de "construcción de ciudades", no me preocupan los hacks porque el motor del cliente no fallará cuando diseñe el estado del juego guardado.

Sin embargo, podría abusar de la jugabilidad ya que el jugador necesita gastar monedas del juego (o efectivo premium) para expandir el área jugable para construir más casas / edificios. Por lo tanto, voy a implementar una verificación simple de la cantidad de mosaicos ocupados por el edificio recién agregado contra cuántos mosaicos disponibles hay disponibles.

Desarrollador de juegos Noob
fuente