mmorpg servidor

Iniciado por Kase, 22 Agosto 2012, 10:19 AM

0 Miembros y 4 Visitantes están viendo este tema.

Kase

si, imagino que es un tema trillado (repetido)  pero esta es una cuestion un poco diferente...
no podia dormir y me quede pensando, como hacer un servidor mmorpg.... que se necesita?

y mi interrogante me llevo a simplficarlo.

- debemos trasmitir los datos de los usuarios a los demas usuarios ( ._.) entonces pense en el ¿como?.. y conclui en un "objeto"  mapa que guarde las cordenadas de los usuarios y este objeto sea retrasmitido a todos los clientes.
pero esto solo tendria posiciones, entonces pense en mas objetos...

objetos "usuarios" con parametros como cordenadas x,y, vida, estado, accion_realizando y asi. de este modo el cliente solo tiene que leer los datos y desplegarlos. y luego pense en los moustros y npcs.. y dije, ok, tal vez ese mapa debe aceptar arreglos mas aya de el objeto "usuario"


pero cambiando de tema, pense en como mantener el mapa en memoria y a la vez servirlo a n usuarios sin lag... obviamente no podemos generar un mapa para cada usuario con los mismos valores siempre.. el mapa debe ser global, y sus datos deben estar en ram necesariamente. y debe  enviar informacion cada x milesimas de segundo a todos lo usuarios.. (de modo que no puede enviar uno por uno) y me cuestiono, el envio de informacion al mismo tiempo se realizaria con hilos?


luego pasando a temas de seguridad, el mapa deberia checar que cada peticion que reciba sea valida. e ignorar las que no lo son, e incluso beanear cuando las cuentas  cuando se spamea una peticion no valida. pero esto retrasaria el procesamiento del mapa.. podria entonces encenderse banderas para confiar en usuarios o para desconfiar. no?


como ven mis delirios de 3 am...  estoy mal o bien en mi teoria de un servidor mmo...

el cliente es punto y aparte. y obviamente iria con sokets, e interpretando y mostrando el mapa..




curioso.. cree un tema igual en el 2007 xD solo que esta vez tengo mas idea de como hacerlo.
pero rescatando cosas del tema anterior.

ese objeto mapa, solo deberia reenviar informacion de lo que "se a movido"

<<<-Basura->>>

Pues el servidor lo que hace es mapear a todo en el mapa. Pero el mapa es dividido por sectores. para asi tratar de enviar la mínima información a un usuario de otros usuarios, esto para evitar el lag.

Ejemplo en el sector X, tenemos 4 usuarios... solo veras esos 4 usuarios conforme te muevas entras en otro sector, perdiendo a los usuarios anteriores y viendo nuevos usuarios...
<<<--Basura-->>>

Kase

lo estuve pensando mas..

mapa podria ser un arreglo bidimencional donde se guarde objetos..  por ejemplo en
mapa[304][215] esta el objeto "usuario:kase"


y tenemos un servidor de conexiones con sokets..sirviendo cada 200ms   todo lo que aya en un area  de 20 x 20 al usuario
entonces podria enviarse un json con lo que hay entre mapa[289][200] y mapa[319][230]

el cliente simplemente le la informacion  y la  despliega..

el problema es que en el peor de los casos se enviarian asta 200 objetos D:
pero en un caso promedio se enviarian unos 20 objetos kisas. digamos unos 4 usuario mas, unos cuantos moustros, unas cuantas cosas tiradas.

cuanto podria pesar un objeto?  1kb a lo mucho?  en el peor de los casos se enviarian 200kb al usuario. y en un caso promedio unos 20kbs.


se me ocurre dividir el servidor en aplicaciones, una que gestione conexiones, otra que gestione el mapa, y otra que gestione la ia de los moustros.

duda existencial?  seria combeniente tratar cada conexion con un usuario como un hilo nuevo? o que un hilo atienda varios usuarios? 

<<<-Basura->>>

Jajaja.. no...

Lo que haces es descargar todos los objetos en la computadora del Usuarios, el servidor nada mas lo que hace es decir que en la posición tal hay algo. entonces el programa que este el lado del cliente lo que hace es asociar ese algo con lo gráfico que le dijo que el servidor había.

El mapa, las figuras y todo lo demás lo tiene el cliente, el servidor nada mas tiene las posiciones
<<<--Basura-->>>

Kase

o_O

no, si tuviera solo las posiciones seria un nido de hackers.. xD  el servidor controla todo... el cliente solo lo muestra en pantalla..

al decir un arreglode objetos, no me refiero a un arreglo con los spirts..

sino a un objeto ejemplo

class Usuario:
  id = 10
  nombre = 'kase'
  vida = 150
  vida_actual = 50
  accion_actual = {'accion':'dando espadaso','hora':22:39:01:23}


a eso me refiero con objeto.. xD

<<<-Basura->>>

#5
Para evitar gran cantidad de crackers que no tienen nada que hacer nada mas que fastidiar tu juego XD, puedes validar los datos en el servidor.

El cliente no TIENE QUE!! manipular la información. simplemente mostarla.

class Usuario:
 id = 10
 nombre = 'kase'
 vida = 150
 vida_actual = 50
 accion_actual = {'accion':'dando espadaso','hora':22:39:01:23}


Ese ejemplo esta mal, muy mal...
Por ejemplo
-para que necesitas pasarle el nombre al servidor?
-para que necesitas decirle cuanta vida tienes?

lo único bueno es la accion que estas haciendo... pero ?

-para que necesitas pasarle la hora al servidor ? si este la puede calcular de forma local?

Algo medio bien hecho sería:
accion: Golpe[int]
Quien: Bicho[int]
Pos_Bicho: 123,124


Después cuando los datos llegan al servidor lo que haces es calcular la diferencia de posición contra los datos almacenados en el servidor para ver si es real, para evitar hackers.

Después de validar todos los datos... el servidor puede responder con un simple numero, digamos un array de int:
[ 0 ]No tienes rango
[ 1 ]Esa acción no esta permitida
[ 2 ]No tienes ningún tarject
....
El cliente asocia ese numero a un string que tiene almacenada en su pequeña base de datos...?
Nota: Nunca pasaste la string por red

Es simple, recuerda que para que tu servidor sea eficiente, tenes que pasar la menor cantidad de datos por red ya que puedes generar mucho trafico.
<<<--Basura-->>>

Kase

o_O me mal interpretaste.. esos no son los datos que yo le mando al servidor...

son los datos que el servidor manda a los usuarios...  datos mas, datos menos, pero es solo una plantilla del objeto..

<<<-Basura->>>

Igual :D el servidor deberia mandar solo una vez el nombre y datos principales XD
<<<--Basura-->>>

gAb1

Si quereis ver un buen ejemplo de mecanicas de juego tipo mmorpg pasaros por https://github.com/TrinityCore/TrinityCore ;)

- gAb1

ABDERRAMAH

#9
Yo estoy investigando y tratando de crear otra arquitectura diferente, la llamo de "servidor pasivo" donde el servidor NUNCA inicia una conexión con un cliente, al contrario solamente responde a las órdenes de los clientes, que pueden ser de lectura o escritura al más puro estilo base de datos. Son los clientes los que "procesan" el mundo. ¿y los comportamientos integrados en el propio mundo? bien, aquí llega lo complicado.

Cada mapa de este juego (por ahora chat 2D) es alojado por un usuario, el cual es responsable de ejecutar los fragmentos de código contenidos por el mapa y enviarlos al servidor. Es ineficiente en cuanto a ancho de banda, puedo moverlo en red local, pero por vpn fue imposible, ¿el beneficio? el servidor ocupa 21 kb, y se podrían correr muchos en una sola máquina, cada uno en un puerto diferente.

Faltan atar muchos cabos, la idea es que el mundo sea descentralizado, o sea, que gran parte de éste sea creado y mantenido por cada cliente. Por supuesto hay un tipo de servidor independiente que se puede abrir, pero aun tengo que resolver el problema de los códigos (puertas que se abren, botones, sillas pàra sentarse etc...)

entonces mi sistema es así:

1- abre el cliente y pregunta user, login y servidor.

2-se piden los datos del servidor (nombre, array de mapa e información de los posibles bloques de mapa y de avatar con los que se construyen los gráficos)

3- se piden los datos del usuario, los cuales incluyen la última posición registrada y la apariencia (en tres capas). Se pide el mapa señalado en última posición.

4- se precarga una imágen de cada capa del mapa así como otra de la fusión de todas las capas del avatar. se dibuja la escena y se crea un registro en el servidor para indicar que se está online y en dicho mapa.

5- a partir de entonces corre el main loop, el cual se encarga de pedir continuamente la información de cada usuario del mapa y de subir la suya propia, luego lee todos los registros de otra carpeta que guarda los mensajes que son audibles al avatar.

Falta mucho, pero quiero que el mapa esté compuesto de diferentes servidores (modo grid) y que cada uno disponga de sus propios assets y listas de usuarios. Un servidor podría enviar a un avatar propio desde ahí hasta cualquier otro servidor, no sería necesario crear cuenta, y pasaría con sus propiedades (hypergrid). Es ambicioso y posiblemente una mala decisión de ingeniería, pero poco a poco va tomando forma.

unas imágenes del proyecto: http://abdlab.blogspot.com.es/2012/04/proximos-proyectos-imagenes.html