[Aporte] Optimizacion SendData

Shak

Evolution
Miembro del equipo
Developer
Especialista de Argentum
Bueno estaba aburrido y me puse a leer este sub, la verdad es que tarde poco para darme cuenta que matih.- habia hecho lo mismo y que fue de ahí, de donde saque la idea xD . Para no bajonearme (?) quise hacerlo con cuatro senddatas, más.

Agregamos este módulo (Senddata1) [Elegi este nombre para tener el original arriba, y así codear mejor.

Código:
'Este módulo fue creado por Shak. Osea por mi, JIJIJI https://www.youtube.com/watch?v=FzN4Ep5Jkgk
'La idea es almacenar en arrays, toda la información necesaria, para luego utilizarla. _
    En vez de recorrer todos los usuarios, simplemente almacenamos en cada array con lo que necesitemos
'Ahora que empece a codearlo, me acorde que matih.- lo hizo ya con los gms PUTA BIDA, pero para no bajonearme, lo hice con los demás xD
Option Explicit

''Declaramos las variables

Public Const MAX_GMS As Byte = 15
Public Const MAX_CONSEJOS As Byte = 5
Public Const MAX_CONCILIOS As Byte = 5
Public Const MAX_DIOSES_ADMINES As Byte = 2

Public ArrayGM(1 To MAX_GMS) As Integer
Public ArrayConsejo(1 To MAX_CONSEJOS) As Integer
Public ArrayConcilio(1 To MAX_CONCILIOS) As Integer
Public ArrayDioses(1 To MAX_DIOSES_ADMINES) As Integer

Public Enum eArraysSendData
    Gms = 1
    Consejo
    Concilio
    AdminDios
End Enum
Public Function InitArrays()
    Dim i As Integer
   
    For i = 1 To MAX_GMS
        ArrayGM(i) = -1
    Next i
   
    For i = 1 To MAX_CONSEJOS
        ArrayConsejo(i) = -1
    Next i
   
    For i = 1 To MAX_CONCILIOS
        ArrayConcilio(i) = -1
    Next i
   
    For i = 1 To MAX_DIOSES_ADMINES
        ArrayDioses(i) = -1
    Next i
End Function
Public Function SlotFreeSendData(ByVal Tipo As eArraysSendData) As Byte
'Buscamos un slot libre para meter al UserIndex
   
    Select Case Tipo
        Case eArraysSendData.Gms
            For SlotFreeSendData = 1 To MAX_GMS
                If ArrayGM(SlotFreeSendData) = -1 Then
                    Exit Function
                End If
            Next SlotFreeSendData
           
        Case eArraysSendData.Consejo
            For SlotFreeSendData = 1 To MAX_CONSEJOS
                If ArrayConsejo(SlotFreeSendData) = -1 Then
                    Exit Function
                End If
            Next SlotFreeSendData
       
        Case eArraysSendData.Concilio
            For SlotFreeSendData = 1 To MAX_CONCILIOS
                If ArrayConcilio(SlotFreeSendData) = -1 Then
                    Exit Function
                End If
            Next SlotFreeSendData
           
        Case eArraysSendData.AdminDios
            For SlotFreeSendData = 1 To MAX_DIOSES_ADMINES
                If ArrayDioses(SlotFreeSendData) = -1 Then
                    Exit Function
                End If
            Next SlotFreeSendData
    End Select
   
   
    SlotFreeSendData = -1
End Function
Public Function SlotAlmacenadoSenddata(ByVal UI As Integer, ByVal Tipo As eArraysSendData) As Byte
    With UserList(UI)
        Select Case Tipo
            Case eArraysSendData.Gms
                For SlotAlmacenadoSenddata = 1 To MAX_GMS
                    If ArrayGM(SlotAlmacenadoSenddata) = UserIndex Then
                        Exit Function
                    End If
                Next SlotAlmacenadoSenddata
               
            Case eArraysSendData.Concilio
                For SlotAlmacenadoSenddata = 1 To MAX_CONCILIOS
                    If ArrayConcilio(SlotAlmacenadoSenddata) = UserIndex Then
                        Exit Function
                    End If
                Next SlotAlmacenadoSenddata
               
            Case eArraysSendData.Consejo
                For SlotAlmacenadoSenddata = 1 To MAX_CONSEJOS
                    If ArrayConsejo(SlotAlmacenadoSenddata) = UserIndex Then
                        Exit Function
                    End If
                Next SlotAlmacenadoSenddata
               
            Case eArraysSendData.AdminDios
                For SlotAlmacenadoSenddata = 1 To MAX_DIOSES_ADMINES
                    If ArrayDioses(SlotAlmacenadoSenddata) = UserIndex Then
                        Exit Function
                    End If
                Next SlotAlmacenadoSenddata
        End Select
    End With
End Function
Public Sub SacarUserIndexSendData(ByVal UserIndex As Integer)
Dim Slot As Integer
    With UserList(UserIndex)
       
        'Gms
        If .flags.Privilegios And _
            (PlayerType.Admin Or PlayerType.Dios Or PlayerType.SemiDios Or PlayerType.Consejero) Then
                Slot = SlotAlmacenadoSenddata(UserIndex, Gms)
                ArrayGM(Slot) = -1
        End If
       
        'Concilios
        If .flags.Privilegios And PlayerType.RoyalCouncil Then
            Slot = SlotAlmacenadoSenddata(UserIndex, Concilio)
            ArrayConcilio(Slot) = -1
        End If
       
        'Consejos
        If .flags.Privilegios And PlayerType.ChaosCouncil Then
            Slot = SlotAlmacenadoSenddata(UserIndex, eArraysSendData.Consejo)
            ArrayConsejo(Slot) = -1
        End If
       
       
        'Dioses / Admines
        If .flags.Privilegios And (PlayerType.Admin Or PlayerType.Dios) Then
            Slot = SlotAlmacenadoSenddata(UserIndex, eArraysSendData.AdminDios)
            ArrayDioses(Slot) = -1
        End If
    End With
End Sub
Public Sub CheckArraySendData(ByVal UserIndex As Integer)
'Autor: Shak
' Chequeamos en que array puede entrar el personaje.

    With UserList(UserIndex)
       
        'Gms
        If .flags.Privilegios And _
            (PlayerType.Admin Or PlayerType.Dios Or PlayerType.SemiDios Or PlayerType.Consejero) Then
           
                Slot = SlotFreeSendData(eArraysSendData.Gms)
           
                If Slot <> -1 Then
                    ArrayGM(Slot) = UserIndex
                End If
        End If
       
        'Concilios
        If .flags.Privilegios And PlayerType.RoyalCouncil Then
            Slot = SlotFreeSendData(eArraysSendData.Concilio)
           
            If Slot <> -1 Then
                ArrayConcilio(Slot) = UserIndex
            End If
        End If
       
        'Consejos
        If .flags.Privilegios And PlayerType.ChaosCouncil Then
            Slot = SlotFreeSendData(eArraysSendData.Consejo)
           
            If Slot <> -1 Then
                ArrayConsejo(Slot) = UserIndex
            End If
       
        End If
       
        'Dioses / Admines
        If .flags.Privilegios And (PlayerType.Admin Or PlayerType.Dios) Then
            Slot = SlotFreeSendData(eArraysSendData.AdminDios)
           
            If Slot <> -1 Then
                ArrayDioses(Slot) = UserIndex
            End If
        End If
    End With
End Sub
Ahora para aplicarlo, es bastante sencillo

Código:
        Case SendTarget.ToAdmins
            For LoopC = 1 To MAX_GMS
                If UserList(ArrayGM(LoopC)).ConnID <> -1 Then
                    'If UserList(LoopC).flags.Privilegios And (PlayerType.Admin Or PlayerType.Dios Or PlayerType.SemiDios Or PlayerType.Consejero) Then
                       
                        ' Denounces can be desactivated
                        If IsDenounce Then
                            If UserList(ArrayGM(LoopC)).flags.SendDenounces Then
                                Call EnviarDatosASlot(ArrayGM(LoopC), sndData)
                            End If
                        Else
                            Call EnviarDatosASlot(ArrayGM(LoopC), sndData)
                        End If
                   'End If
                End If
            Next LoopC
            Exit Sub
Código:
        Case SendTarget.ToConsejo
            For LoopC = 1 To MAX_CONSEJOS
                If (UserList(ArrayConsejo(LoopC)).ConnID <> -1) Then
                    'If UserList(LoopC).flags.Privilegios And PlayerType.RoyalCouncil Then
                        Call EnviarDatosASlot(ArrayConsejo(LoopC), sndData)
                    'End If
                End If
            Next LoopC
            Exit Sub
Código:
        Case SendTarget.ToConsejoCaos
            For LoopC = 1 To MAX_CONCILIOS
                If (UserList(ArrayConcilio(LoopC)).ConnID <> -1) Then
                    'If UserList(LoopC).flags.Privilegios And PlayerType.ChaosCouncil Then
                        Call EnviarDatosASlot(ArrayConcilio(LoopC), sndData)
                    'End If
                End If
            Next LoopC
            Exit Sub
Código:
        Case SendTarget.ToHigherAdmins
            For LoopC = 1 To MAX_DIOSES_ADMINES
                If UserList(ArrayDioses(LoopC)).ConnID <> -1 Then
                    ' if UserList(LoopC).flags.Privilegios And (PlayerType.Admin Or PlayerType.Dios) Then
                        Call EnviarDatosASlot(ArrayDioses(LoopC), sndData)
                   'End If
                End If
            Next LoopC
            Exit Sub
Basicamente, la forma de manejarse es la misma que la que hizo matih.-
A diferencia de que elegí usar constantes, en vez de re dimensionar las arrays en cada caso (Ya que hasta donde sé, me dijeron que es mejor)
Además, POR LO GENERAL, en un servidor, LOS GMS no superan los 10, los consejos no superan los 3 al igual que los concilios... Y admines-Dioses, seran 4 5 como mucho POR LO GENERAL. (Yo le puse 2)
 
Arriba