Mensajes con ParamArray y no Optional (Mejora en mensajes)

Ir abajo

Mensajes con ParamArray y no Optional (Mejora en mensajes)

Mensaje por Toyz el 19/3/2016, 1:26 am

Bueno hace poco hice esta guía: si o sí deberan leer esa guía y la que deje dentro de esa guía, si no, no entenderán.
http://www.servers-argentum.org/t35526-mejora-al-mandar-mensaje-en-consola-explicado-parte-2

Otra forma de hacerlo es con ParamArray, con esto sacamos los 4 parametros opcionales y podemos elegir la cantidad de parametros que queramos.
Es decir antes enviaba:
Arg1
Arg2
Arg3
StringArg1

De esta manera podemos conseguir lo siguiente:
Arg(0)
Arg(1)
Arg(2)
Arg(3)
Arg(4)
Todos los que queramos.

Antes de la guía con ParamArray dejo el nuevo Write:

Código:
Public Sub WriteMultiMessage(ByVal UserIndex As Integer, ByVal MessageIndex As Integer, ParamArray Args())
'***************************************************
'Author: Unknown
'Last Modification: G Toyz (19/03/2016)
'
'***************************************************

On Error GoTo Errhandler
    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
        
            Case eMessages.NPCHitUser
                Call .WriteByte(Args(0)) 'Target
                Call .WriteInteger(Args(1)) 'damage
            
            Case eMessages.UserHitNPC
                Call .WriteLong(Args(0)) 'damage
            
            Case eMessages.UserAttackedSwing
                Call .WriteInteger(UserList((Args(0))).Char.CharIndex)
            
            Case eMessages.UserHittedByUser
                Call .WriteInteger(Args(0)) 'AttackerIndex
                Call .WriteByte(Args(1)) 'Target
                Call .WriteInteger(Args(2)) 'damage
            
            Case eMessages.UserHittedUser
                Call .WriteInteger(Args(0)) 'AttackerIndex
                Call .WriteByte(Args(1)) 'Target
                Call .WriteInteger(Args(2)) 'damage
            
            Case eMessages.WorkRequestTarget
                Call .WriteByte(Args(0)) 'skill
        
            Case eMessages.HaveKilledUser '"Has matado a " & UserList(VictimIndex).name & "!" "Has ganado " & DaExp & " puntos de experiencia."
                Call .WriteInteger(UserList(Args(0)).Char.CharIndex) 'VictimIndex
                Call .WriteLong(Args(0)) 'Expe
        
            Case eMessages.UserKill '"¡" & .name & " te ha matado!"
                Call .WriteInteger(UserList(Args(0)).Char.CharIndex) 'AttackerIndex
        
            Case eMessages.EarnExp
        
            Case eMessages.Home
                Call .WriteByte(CByte(Args(0)))
                Call .WriteInteger(CInt(Args(1)))
                'El cliente no conoce nada sobre nombre de mapas y hogares, por lo tanto _
                 hasta que no se pasen los dats e .INFs al cliente, esto queda así.
                Call .WriteASCIIString(Args(3)) '
            
        End Select
    End With
Exit Sub ''

Errhandler:
    If Err.Number = UserList(UserIndex).outgoingData.NotEnoughSpaceErrCode Then
        Call FlushBuffer(UserIndex)
        Resume
    End If
End Sub

Empecemos.
Como dije anteriormente, ahora podemos mandar todo tipo de datos.
La llamada del Call WriteMultiMessage es la misma pero sin parametros opcionales, si no los parametros que nosotros queramos.

Ejemplo:

Código:
Call WriteConsoleMsg(Index, ID, 88, 55, 66, 1000, 80000, userlist(userindex).name, "¡Hola!", 1.555)

Sí, se pueden enviar todos esos datos.
Pero cambia una cosa comparado a los opcionales y es el envío.

En ese caso el envío va a ser:
Código:
           Case eMessages.ID
                Call .WriteByte(Args(0)) 'Acá enviamos el 88
                Call .WriteByte(Args(1)) 'Acá enviamos el 55
                Call .WriteByte(Args(2)) 'Acá enviamos el 66
                Call .WriteByte(Args(3)) 'Acá enviamos el 1000
                Call .WriteInteger(Args(4)) 'Acá enviamos el 80000
                Call .WriteASCIIString(Args(5)) 'Acá enviamos el nombre del usuario
                Call .WriteASCIIString(Args(6)) 'Acá enviamos el ¡Hola!
                Call .WriteDouble(Args(7)) 'Acá enviamos el 1.555 /code]

Aviso muy importante, cuidado con que envían, recuerden los valores.

Por ejemplo no podemos enviar como integer al 80000 porque contiene más de 32k y si lo hacemos nos va a tirar error de automatización o desbordamiento. (No recuerdo)

En la parte del cliente se sigue recibiendo igual, obviamente tienen que recibir los 8 datos y con sus variables correspondientes.
avatar
Toyz
Administrador
Administrador

¿BANEADO? : No.
Premios :
[1er puesto] Usuario del año 2016
Cantidad de envíos : 5046
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.