[Devlog] Emulador de WarRock CP1

Jastro

#60 que bonico, me da hasta ilusion ver una captura de pantalla ahi xD

1 1 respuesta
DarkRaptor

#61
Me he acordado de ti por la moto y por eso lancé Emblem jajaja

No se si os interesa tanto el aspecto técnico, pero intentaré currarme esos tochos por las noches que es cuando ya estoy reventado para poder darle caña durante el día. Mi objetivo es tener algo muy básico de modos de juego este fin de semana (por ejemplo FFA) para poder meterme a programar daño, muertes y tal.

1 respuesta
Jastro

#62 a mi al menos me parece interesante, yo no sabría ni por donde empezar y me mola ver lo que vas planteando

DarkRaptor

Al final ayer me lié bastante con

Y no puse nada por aquí, pero creo que voy a esperar y enseño todo del tirón: he descubierto haciendo pruebas ingame que hay un error en mi módulo que gestiona las conexiones UDP y no estaba mandando las IP y los puertos al resto de jugadores de forma correcta, por lo que siempre recurren al tunneling. Hoy voy a sentarme a ver qué cojones he hecho mal y una vez que esté listo muestro las tripas de lo que he estado haciendo.

RPV: pium pium ya funciona.

PD: Puto UDP y puto Endianness the mierda

raul_ct

de las pruebas de ayer, al no haber daño a vehiculos puedes salirte del mapa

Tambien se puede hacer esto, pero bueno los tiros van, y va bien la verdad

y aviso a navegantes:


No os paseis de vicio, que os llenais el inventario

1
DarkRaptor

Bueno, voy con los tochos de rigor que hay bastante tela que cortar.

En mi último tocho señalé que estando ya la lógica de las salas más o menos lista (crear, destruir, actualizar, informar etc.) se abría un nuevo frente enorme que a su vez abría otros, pero el principal era este:

2024-08-18 14:06:19,779 - INFO - IN:: bytearray(b'2156784 30000 0 0 2 150 0 0 3 3 1 0 0 0 0 0 \n')

Ese paquete, el 30000 o DO_GAME_PROCESS es el paquete principal del juego en tanto que en función del byte 4 (contando desde el 30000, en este caso, 150) se decide qué representa los contenidos del paquete, que puede variar mucho. Os enseño un ejemplo de un DUMP de un capítulo más nuevo, pero muy ilustrativo.

Subpackets 30000

Otra característica del paquete 30000 es que la respuesta que espera el cliente suele ser ese mismo paquete con algunos cambios en los bytes. Ahora bien, el que manda el recibe puede ser:

a) La sala (para todos los jugadores)
b) El propio usuario que lo mandó
c) Otro usuario

Para poder gestionar esto de manera lógica y sin marcarme un Undertale, extendí la lógica que estaba siguiendo de:

paquete <----> handler

de manera que todos los paquetes con ID 30000 vayan a un handler genérico que procesa todos los bytes, busca un handler específico para ese subpaquete y luego responde (o no) en función de lo que le diga ese handler. De forma que yo en cada handler solo tenga que procesar los bytes del paquete 30000, tomar decisiones y luego responder al lobby de la sala, al jugador o incluso cambiar el subtipo.

Ejemplo

Todos los handlers heredan de un handler abstracto para el paquete 30000 tal que así

Base GameHandler

En definitiva, que cuando me llega un paquete 30000 simplemente tengo un handler genérico que usa un patrón de factoría (o como se diga en español) para elegir el subhandler más adecuado y listo.

¿Y todo esto para qué?

Pues con este paquete bajo control el desarrollo se simplifica muchísimo, puesto que implementar los subpaquetes es una trivialidad en la mayoría de los casos. Con este paquete implementado todos los controles de la sala están listos: se puede cambiar de mapa, ponerte o no listo, poner el ping limit e incluso empezar a jugar.

Así que básicamente eso hice, implementé primero todos los controles de la sala

Con todo esto listo, era hora de enfrentarse al verdadero reto: lanzar la sala y jugar. Para mi desgracia, aquí brillaba por su ausencia mi falta de formación básica en informática y estuve un par de días perdiendo el tiempo con el protocolo UDP, el endianness de las cosas y las redes. Pero eso es historia para otro día que buena chapa llevo ya.

Jastro

let me in :(

1 respuesta
DarkRaptor

#67
Píllate un cliente de 2008 (wr04082008 por ej), métele los parches 17-20, cambia el login.warrock.net (en el hosts o en el cliente) para que apunte a tu server y profit. Tengo todo el código público y en abierto :laughing: aunque ahora mismo no hay ni instrucciones para desplegarlo ni nada. Debería ponerme con eso en algún momento.

@raul_ct te puede indicar

1 1 respuesta
raul_ct

#68 no hay intenciones de parchear el cliente para editar xosas?

1 respuesta
DarkRaptor

#69
No pienso tocar nada hasta que no acabe el server. Estaba usando unas referencias de mi antiguo server para el tema de curarse y low and behold: del que estoy usando al que uśabamos de aquella cambian unos IDs lamentaplas que me jodían todo. Así que por no mezclar no toco nada xd Ya cuando tenga el servidor terminado trataré de dar soporte a las 3 versiones ppales que hay rulando del capítulo 1: PF17, PF20, PF23.

DarkRaptor

Estos días he estado trabajando en silencio. Total, no es que haya tenido mucha acogida el tochamen máximo y no era una parte del servidor que necesitate documentar para mi mismo.

El caso es que estoy bastante cerca de terminar el emulador y unirme al grupo de parias de este sub que termina proyectos. 2/4 modos principales de juego están acabados, casi todo el ciclo de juego está terminado y solo queda un sistema gordo por implementar: vehículos. He llegado a ese punto en el que ya estoy básicamente traduciendo el código que yo mismo escribí hace 8 años en C# y eso facilita bastante todo, porque uno siempre recuerda mejor su propia lógica. Además es código trilladísimo de cuando lo jugaba con amigos.

Podría darme otro arreón de 2 semanas y terminarlo, pasando así a investigar paquetes que nunca se han implementado como:

  • Modo espectador, aunque no existía en el internacional CP1 los paquetes están documentados y en modo admin el menú está.
  • Investigar las clan war en salas, en lugar de lo que hacía el server original, usando los recursos del propio juego.
  • Tonterías cosméticas.

En su lugar, voy a ver si consigo engatusar a alguna persona que conozco y que jugaba por aquella época y hacerle un testeo al servidor con el mayor número de jugadores posibles, para ir sacando y corrigiendo bugs antes de haga bola de nieve. Si alguno de por aquí se anima también es bienvenido aunque yo mantendría las expectativas bajas. Seguro que crashea todo en cuanto nos pongamos varios jajajaja nada sale nunca bien a la primera.

Algunos gifs

Lanzando salas

Volviendo al lobby

3 1 respuesta
Jastro

#71 en nada torneo mediavidero

1 respuesta
DarkRaptor

#72
A ver si junto primero suficientes dummies para lanzar una sala y probar a fondo las mecánicas core como el daño, curarse, spawnear etc. porque no las tengo todas conmigo xd En mis PCs va siempre de lujo pero el 1v1 es un escenario idealizado.

DarkRaptor

Esta mecánica no la usaba casi nadie pero como preámbulo para implementar los vehículos está graciosa.

Lanzar una salva de artillería era algo que casi nadie hacía porque solo estaba disponible en un puñado de mapas. Curiosamente, el juego lanza proyectiles específicos para hacer daño al jugador y otros para hacer daño a vehículos "a lo que pille" sin remitente aparente. Tengo que investigarlo más.

1 1 respuesta
kidandcat

#74 No conozco el juego, pero con esas imagenes ya va teniendo buena pinta, parece un CS1.6 x battlefield

2 respuestas
Jastro

#75 era muy arcade la verdad, para matar a alguien tenias que gastar un cargador entero xDDD

1 respuesta
DarkRaptor

#76
Para nada :sweat_smile: eso es más bien una consecuencia de las conexiones de 1 mega de la época y el mix UDP/TCP que gasta el juego. Y más si vivías en Canarias.

Si es cierto que la hitbox tiene un malus notorio en tiros al muñeco (casi -40%). Nunca tendré acceso a la tabla de huesos originales del juego porque era server side y la he reconstruido empíricamente (gracias al actual publisher) a partir de datos de 3-5 armas, pero es lo que parece.

En promedio, 4-5 balas matan en la mayoría de los casos. La movilidad, que si es muy clave y la dispersión hacen que acabes tirando 14-16 balas.

Algo que ni yo ni nadie ha conseguido reconstruir el decaimiento de la bala por distancia. Sabemos que existe, sabemos que originalmente era client side incluso, pero no sabemos (o yo no sé) cuáles son los rangos de distancia a partir de los cuales se salta de LOW a MID o HIGH.

Tengo pensado en el futuro meterme en el juego oficial e intentar extraer algunos datos pero no me preocupa mucho.

1 respuesta
Jastro

#77 ostia pues yo recuerdo que matar a alguien era un full cargador y se escuchaba el sonido de los hits jajajajajaja

pero si, puede ser tema de conexion xDD

1 respuesta
DarkRaptor

#78
A ver, me pongo un poco técnico pero es fácil de explicar. Los protocolos y conexiones principales del cliente en Chapter 1 son 3:

  1. Una conexión TCP al server para comunicación server-cliente a través del puerto 5340
  1. Dos conexiones UDP al server. Una al puerto 5350 desde el cual se anuncia la IP del jugador, se manda el ping etc. y se establece el tunneling. Otra a un STUN server en el puerto 5351. Si el juego al conectarse al STUN detecta un NAT simétrico, asume que el jugador no va a poder establecer una conexión UDP directa con el resto de jugadores y usa la 1a conexión para reenviar paquetes UDP al resto de jugadores pasando por el servidor (tunneling). Esto causa el famoso ping 999

  2. N conexiones UDP con el resto de jugadores, en función de lo que he dicho arriba.

Interestingly, cuando cliente A y B llegan a la conclusión de que A ha disparado a B, A (o B, no me acuerdo) manda un paquete 30000 con el arma, la hitbox, el radio de explosión (si procede) y las coordenadas 3D de lo que asumo que es la víctima. Finalmente, manda la info del cargador, de la munición restante y el código del arma. No se manda el daño crudo, al menos en CP1. Tengo pendiente con #9 meterme en el cliente de la beta (que he hecho funcionar con mi server) a ver si en la beta el cliente mandaba más info que podamos usar para hacer ingeniería inversa.

¿Qué ocurre? Que en la época nuestras conexiones de 1/3 megas y nuestros primeros routers sin UPnP daban lugar a muchos paquetes perdidos y por tanto, muchos tiros que no se registraban, sobre todo si el paquete tenía que pasar por el servidor. De hecho al principio del todo (estoy hablando de memoria) el packet stack del server mantenía los paquetes de daño de ambos jugadores incluso cuando 1 mataba al otro, de forma que era común "la doble muerte por lag" cuando uno mataba al otro y con retardo llegaban los disparos del otro :laughing:

En las pocas partidas que he jugado, tanto haciendo pruebas en este servidor como en el antiguo, ahora que las conexiones son bastante mejores y tb. con servidores más modernos, las armas matan mucho más rápido. El cálculo crudo del arma, por muy aproximado que lo tenga, no deja lugar a dudas.

Todavía quedan algunas incógnitas que supongo que nunca resolveremos. CREO que G1/Nexon etc. siguieron manteniendo el daño bruto del arma en el server, pero al menos actualizaban el binario que muestra las stats en la tienda. ¿Los modificadores de hitbox y distancias? Desde luego no casan 100% con lo que dice el cliente, así que seguramente se cambiaron en el server y nunca sabremos exactamente cuáles eran los originales.

#75
Está a medio camino entre el cs 1.6 y el css en gráficos creo yo. Originalmente se vendía como un clon F2P del BF2 para ordenadores de bajo rendimiento. Esto es algo que echo de menos ahora que parece que todo tiene que ir hasta las trancas de RTX por huevos.

DarkRaptor

Como no parece que vaya a poder testar nada del server por falta de quorum entre los míos, he decidido ponerme ya con los vehículos por ser el último "desafío".

Entrar en un vehículo

Salir del vehículo

Reventar vehículos

Me falta una tontería que es el daño vehículo ---> jugador pero es muy similar a los demás y tardo más en encender 2 pcs para probarlo que en hacerlo. Con esto terminado me quedarían 2 modos de juego que están documentadísimos (todo el que hace un emulador los programa) y que no me van a dar mucha guerra... y poco más.

2
14 días después
DarkRaptor

No estoy muerto, pero he tenido un par de semanas complicadas de trabajo y no me he podido sentar con esto. El emulador, a falta de 2 gilipolleces, está prácticamente terminado. A ver si tengo un rato y me explayo.

1 2 respuestas
Jastro

#81 cuando lo termines, cual sera tu plan? montaras server dedicado? o lo tienes solo pa ti?

1 respuesta
StKK

#81 Eres un hijo de mil reputas... como se te ocurre no informarme de esto? JAJAJAJAJAJA Te conocí cuando tenías... 13 años? y como ha pasado el tiempo jajajaja. En su día me presté a ayudarte con testeos en el primer mod y lo recuerdo con cariño. Lo peor es que hace poco hablé con otro mítico de esa epoca y me pasó el rap que le hizo uno a Masnak jajajajajajaja! Aaay los feels...

Cualquier cosa ya me tienes en Steam o por aquí. La putada es que me he quedado sin pc para unos días, pero cuando lo tenga de nuevo te humillo en larga de Velruf cuando quieras xD.

1 respuesta
DarkRaptor

#82
Nada, lo documentaré y seguiré con mi vida xd Si estoy haciendo esto antes de que toda la info. desaparezca de mi memoria jajajaj Si acaso modificaré a saco un cliente para dejarlo "como debería haber sido" AKA abrir todas las armas, meter todos los vehículos que están en los datos y algún mapa no sidoso de los últimos caps. Poco más.

#83
Tatu :)

#83StKK:

AJAJAJAJAJA Te conocí cuando tenías... 13 años?

15, exactamente los mismos que han pasado. Con 13 no sabía ripear modelos de la memoria de la gráfica para meterlos en el COD4 xddd

#83StKK:

Lo peor es que hace poco hablé con otro mítico de esa epoca y me pasó el rap que le hizo uno a Masnak jajajajajajaja

El otro día sin querer puse @Masnak y creo que es el mismo pavo jajajaja

#83StKK:

Cualquier cosa ya me tienes en Steam o por aquí. La putada es que me he quedado sin pc para unos días, pero cuando lo tenga de nuevo te humillo en larga de Velruf cuando quieras xD.

Gracias, igual te aviso cuando necesite un test masivo. Por lo demás, mi idea era simplemente dejar una implementación open source para la posteridad y no mucho más. Pero siempre me apunto a pegar 4 tiros.

1
DarkRaptor

Bueno, no hay muchas fotos porque estoy en casa ajena y este modo de juego necesita 2 PCs si o si para testearlo bien pero el modo Explosive (el más jugado originalmente) está casi terminado a falta de detalles.

He empezado a hacer una lista de features que quedan por terminar para considerar el emulador completado, a grosso modo son las siguientes:

  1. Invitar jugadores a la sala.
  2. Kickear tanto desde el lobby como con la votación del juego interna.
  3. Implementar un par de rutinas para guardar datos en la DB sin esperar a los puntos típicos de otros emuladores.
  4. Sistema de clanes

Y luego investigar paquetes que no se usaban en aquella época pero que el cliente si tiene:

  1. Modo espectador para usuarios con permisos de nivel 5
  2. Clan war dentro del propio servidor ¿? (Ni idea de si esto está completo)

También me he planteado mantener 2 versiones del cliente. Una la original, PF20, tal y como era el juego en verano de 2008 y otra custom, hecha por mi, abriendo bastante contenido que estaba en el cliente y con algo de modding por mi parte, para hacer una "rendition" de lo que yo creo que hubiera sido el WR perfecto: prone CQC, todo free, mandar al carrer algunas armas, algo de rebalanceo, meter algún mapa más.

Y poco más, esto es algo que hago por cariño y no tengo intención de montar nada.

5