Mejora al mandar mensaje en consola (Explicado) [Parte 2]

Ir abajo

Mejora al mandar mensaje en consola (Explicado) [Parte 2]

Mensaje por Toyz el 18/3/2016, 1:33 am

Primero deben leer este aporte realizado por un usuario de GS-Zone, que vendría a ser la Parte 1.
http://www.gs-zone.org/temas/mejora-al-mandar-mensaje-en-consola-explicacion.88706/

Empecemos:
En el servidor tenemos este Write:
Código:

Public Sub WriteMultiMessage( _
ByVal UserIndex AsInteger,  _
ByVal MessageIndex AsInteger,  _
Optional ByVal Arg1 As Long,  _
Optional ByVal Arg2 As Long,  _
Optional ByVal Arg3 As Long,  _
Optional ByVal StringArg1 As String)

Como ya sabemos, UserIndex es para quien enviar el mensaje, MessageIndex es el elemento del enum.

Ahora tenemos los parametros opcionales.
Arg1, Arg2 y Arg3, son valores numéricos.
StringArg1, es una cadena de caracteres.

Ahora ¿Para qué sirve esto?

Sirve para identificar lo datos que le asignemos al llamar al método.

Ejemplo de como asignar datos y llamar al método:
Código:

Call WriteMultiMessage(UserIndex, eMessages.Guia, 777, 888, 999, "¡Hola!")

UserIndex = A quien le mostramos el mensaje.
eMessages.Guia = El mensaje de nuestro enum.
777 = Arg1
888 = Arg2
999 = Arg3
"¡Hola!" = StringArg1

Pero nos falta un paso, el cual es, enviar esos datos.

Para enviar esos datos nos dirigimos al WriteMultiMessage
En el cual nos va aparecer esto:
Código:

  With UserList(UserIndex).outgoingData

        Call .WriteByte(ServerPacketID.MultiMessage)
        Call .WriteByte(MessageIndex)

        Select Case MessageIndex
            Case eMessages.DontSeeAnything, eMessages.NPCSwing, eMessages.NPCKillUser, eMessages.BlockedWithShieldUser, _
                 eMessages.BlockedWithShieldother, eMessages.UserSwing, eMessages.SafeModeOn, eMessages.SafeModeOff, _
                 eMessages.ResuscitationSafeOff, eMessages.ResuscitationSafeOn, eMessages.NobilityLost, _
                 eMessages.CantUseWhileMeditating, eMessages.CancelHome, eMessages.FinishHome

El MessageIndex es el elemento que agregamos en el enum del aporte anterior.
Si el mensaje no contiene ningún dato adicional para enviar al cliente, lo pones ahí a dentro.

Si no... creamos un caso nuevo y ponemos los datos a enviar, ejemplo:

Código:

Case eMessages.Guia
        Call .WriteInteger(Arg1) 'Acá enviamos el 777
        Call .WriteInteger(Arg2) 'Acá enviamos el 888
        Call .WriteInteger(Arg3) 'Acá enviamos el 999
        Call .WriteASCIIString(StringArg1) 'Acá enviamos el ¡Hola!

Hay que tener algo claro y son el contenido que tiene cada dato, por ejemplo si en vez de 777, era 50000, no puede ser .WriteInteger, ya que Integer sólo admite hasta 32k, por lo tango debería ser long. Y sería:  Call .WriteLong(Arg1) '50000

Ahora algo que les puede quedar en duda.

¿Cómo hago para enviar una cadena de caracteres sin enviar los número?

Es muy simple, como los parametros Arg1, Arg2, Arg3 y StringArg1 son opcionales le ponemos una "," y listo.
Ejemplo:
Código:

Call WriteMultiMessage(UserIndex, eMessages.Guia, , , , UserList(UserIndex).name)
Ahí estaríamos enviando el nombre del usuario que le salta el mensaje.

¿Entonces como es la parte de envío?

Lo mismo, sólo enviamos la cadena, ejemplo:

Código:

Case eMessages.Guia
        Call .WriteASCIIString(StringArg1) 'Nombre del usuario


Listo con la parte del servidor.

Ahora vamos con la parte del cliente.
En el cliente tenemos un handle el cual recibe los datos que enviamos del Servidor.

Código:

Public Sub HandleMultiMessage()

Ahí mismo se mandan los mensajes a la consola.

Al final de ese Sub, antes de:
Código:

End Select
End With
End Sub


Ponemos en caso de que sea nuestro elemento del enum, recibimos los datos que envió el cliente y ponemos el mensaje en consola, ejemplo:

Código:

Case eMessages.Guia
 
            'Variables que contienen los datos que enviamos del servidor.
            Dim Dato1 as Integer 'Esta variable va almacenar el  777     
            Dim Dato2 as Integer 'Esta variable va almacenar el  888
            Dim Dato3 as Integer 'Esta variable va almacenar el  999
            Dim CaracterRecibido As String 'Esta variable va almacenar la cadena de caracteres
 
            'Ponemos que cada variable reciba cada dato:
 
            'Algo muy importante, tienen que saber que tipo de dato enviaron es decir
            'No le podemos poner ReadByte cuando recibimos el 777, tiraría desbordamiento
            'Por lo tanto le ponen ReadInteger o la variable que acepte ese dato.
            'Lo mismo con las variables, las variables van a almacenar ese dato por lo tanto
            'Tienen que poner la variable correcta, es decir tienen que poner una variable
            'Que acepte ese dato.
 
            'Acá recibimos el primer dato (777). El cual lo almacenamos en la variable "Dato1"
            Dato1 = .ReadInteger
 
          'Acá recibimos el segundo dato (888). El cual lo almacenamos en la variable "Dato2"
            Dato2 = .ReadInteger
 
          'Acá recibimos el tercer dato (999). El cual lo almacenamos en la variable "Dato3"
            Dato3 = .ReadInteger
 
          'Acá recibimos el cuarto dato(¡Hola!). El cual lo almacenamos en la variable "Caracter Recibido"
            CaracterRecibido = .ReadASCIIString
   
            'Lo mandamos a la consola
            Call ShowConsoleMsg("Los datos recibidos son: " & Dato1 & " - " & Dato2 & " - " & Dato3 & " - " & CaracterRecibido, 70, 236, 244, True)
 

Cualquier cosa que no entendieron me avisan.
Espero que les sea útil.
avatar
Toyz
Administrador
Administrador

¿BANEADO? : No.
Premios :
[1er puesto] Usuario del año 2016
Cantidad de envíos : 5045
Edad : 17
Localización : Global.
Fecha de inscripción : 28/09/2014

Ver perfil de usuario

Volver arriba Ir abajo

Volver arriba


 
Permisos de este foro:
No puedes responder a temas en este foro.