Me preguntaba cómo funciona el protocolo multijugador Half-Life 2 en modos como Counter-Strike: Source o Day Of Defeat: Source. Creo que usan algún tipo de ofuscación y algoritmo de compresión propietario. Me gustaría saber cómo se codifican diferentes tipos de mensajes en un paquete.¿Cómo funciona el protocolo multijugador Half-Life 2?
Respuesta
Half-Life 2, Counter-Strike: Source etc. todos utilizan el motor de las válvulas de origen. Válvula tiene un developer wiki que cubre un montón de cosas (que es bastante fresco comprobar que funciona!) ...
Estos artículos interesantes:
Latency Compensating Methods in Client/Server In-game Protocol, Design and Optimization
Me pregunto cuánto representante se necesita para agregar enlaces. No aparece en las preguntas frecuentes. – Copas
Creo que puede ser algo que tenga que ver conmigo solo al hacer la cuenta hace unos días :) –
Estoy muy interesado en la compresión delta y la estructura de los encabezados de paquetes y no pude encontrar esa información. – JtR
Ésta es una pregunta muy complicada, mi sugerencia sería la de buscar en algunos de los motores de juego de red de código abierto:
- http://www.hawksoft.com/hawknl/
- http://www.zoidcom.com/
- http://sourceforge.net/projects/opentnl
- http://www.gillius.org/gne/
También podría ver la fuente código para la serie de terremotos en la que se basa el motor de vida media original.
Enfóquese en las ramas del motor de Quake: algunas terminaron construyéndose hasta el punto de compatibilidad con Half-Life. Motores como FTEQuakeWorld o TomazQuake podrían ser buenos puntos de partida. –
@A. Scagnelli, el motor Source (motor de Half-Life 2) no está basado en el motor Quake. Entonces, si bien sería bueno aprender conceptos básicos de servidor de cliente, no le dará el código exacto. –
Nada le va a dar el código exacto, a excepción de la licencia del motor. Y Source Engine tiene raíces en Quake Engine. – Aistina
Aunque los detalles pueden diferir , el marco general es bastante viejo. Aquí hay una vista general rápida:
En los primeros juegos de fps como Doom y Quake, la posición del jugador se actualizó solo en la respuesta del servidor a su comando de movimiento. Es decir, presionó el botón mover hacia adelante y el cliente le comunicó que al servidor, el servidor ubicó su posición en su memoria y luego transmitió un nuevo estado de juego a su cliente con su nueva posición. Esto condujo a un juego muy lento: disparar, incluso moverse en pasillos estrechos era un juego de predicción de lag.
Los juegos más nuevos permiten que el cliente maneje los disparos y el movimiento del jugador por sí mismo. Aunque esto provocó un movimiento y un disparo sin retardo, abrió más posibilidades de hacer trampa pirateando el código del cliente. Ahora cada jugador se mueve y dispara independientemente en su propia computadora y le comunica al servidor lo que han hecho. Esto solo se rompe cuando dos jugadores chocan entre sí o intentan tomar un poder al mismo tiempo.
Ahora el servidor tiene este flujo de estado del cliente procedente de cada jugador y tiene que sincronizarlos y hacer un juego coherente de ellos. El truco es medir la latencia de cada jugador. El objetivo final es poder disparar un arma de latencia muy baja (como un rifle de francotirador o cañón de riel) sobre un enemigo que se mueve hacia los lados y hacer que golpee correctamente. Si se conoce la latencia de cada jugador, supongamos que el jugador A (latencia de 50 ms) dispara un arma en B (latencia de 60 ms). Para hacer un golpe, el tiro tiene que golpear B donde B estaba hace 60ms, desde donde A estaba hace 50ms.
Esa es una descripción muy aproximada, pero debe darle una idea general.
Esto no explica cómo se codifican los diferentes tipos de mensajes en un paquete. – JtR
"Ahora cada jugador se mueve y dispara independientemente en su propia computadora y le comunica al servidor lo que han hecho". Esto no es cierto, al menos en Half-life 1. El cliente solo puede ejecutar la misma simulación localmente para crear la ilusión de cero retraso, pero el servidor todavía obtiene entradas de control normalmente, no el estado completo. El servidor también tiene la última palabra sobre lo que está sucediendo, por lo que los clientes no pueden usar esto para "romper las reglas del juego". –
Debe consultar Luigi Auriemmas papers en Half-Life. Encontrarás un decodificador de paquetes y algunos algoritmos desensamblados allí, también.
La información de ingeniería inversa en Half-Life 2 puede ser difícil de encontrar, debido a su relevancia para hacer trampa. Supongo que las tablas como mpcforum son su mejor opción.
Esta es la mejor respuesta hasta el momento, incluso si no contiene la respuesta exacta. Al menos tengo una remota posibilidad de encontrar a alguien que sepa sobre esto desde ese foro, ¡gracias! – JtR
Le sugiero que consulte los motores Quake 1-3. Están disponibles con código fuente. El protocolo de Half-Life puede ser un poco diferente, pero lo más probable es que esté lo suficientemente cerca.
- 1. Programación de servidores - Juego simple multijugador - ¿Qué protocolo y tecnologías?
- 2. Decapado utilizando el protocolo 2: Python3-> 2 datos
- 3. ¿Funciona ExternalInterface en el protocolo file:?
- 4. ¿Cómo funciona el protocolo de tiempo de red?
- 5. ¿Cómo funciona JSF 2 ConversationScope?
- 6. Multijugador suave movimiento
- 7. Programación de juegos multijugador
- 8. Multijugador HTML5, Node.js, Socket.IO
- 9. Arquitectura de juego multijugador
- 10. Conceptos básicos de juegos multijugador en línea
- 11. ¿Alguien sabe cómo implementar el protocolo NSFastEnumeration?
- 12. Cómo escribir el protocolo monoide en Clojure?
- 13. ¿Qué es el protocolo SMPP?
- 14. Comprender el Protocolo de Bittorrent
- 15. Fancybox 2 Altura no funciona
- 16. ¿El protocolo uwsgi es más rápido que el protocolo http?
- 17. ¿Cómo se puede extender un protocolo Clojure a otro protocolo?
- 18. Descifrando el protocolo de reflejo de AirPlay
- 19. ¿Cómo leer el protocolo helado en Java?
- 20. Cómo entender el protocolo de Kademlia (KAD)
- 21. Cómo referenciar el protocolo en Objective-C?
- 22. ¿Cómo configuro el protocolo cuando uso RedirectToAction?
- 23. Creando un juego de blackjack multijugador
- 24. Optimal algoritmo de generación de laberinto multijugador
- 25. Comunicación entre el cliente y el servidor utilizando ssl c/C++ - El protocolo SSL no funciona
- 26. Entender el protocolo TLS/SSL
- 27. ¿Cómo funciona el DisplacementMapFilter?
- 28. protocolo sin estado y protocolo con estado
- 29. ¿Por qué no funciona el "caso" con "cuando> 2"?
- 30. WebRTC el correcto? (juego multijugador en tiempo real)
No creo que el protocolo de red sea el término correcto aquí, así que eliminé la etiqueta. –
Llenó la etiqueta, porque eso es exactamente lo que parece preguntar JtR. –