[Aportes] Ranking Top10: Frags, Oro, Retos, Torneos, Clanes

ArgentumGame

Dragón Ancestral Lvl 5
Miembro del equipo
Colaborador
Developer
Moderador de AO
Moderador
Les dejo esta base para un sistema de ranking. Está mucho más simple incluso que el que aporte. Este anda mejor y bueno, mejor lo nuevo que lo viejo dicen. Además me acabo de tomar unos minutos en rediseñarlo

Código:
Option Explicit


Public Const MAX_TOP As Byte = 10
Public Const MAX_RANKINGS As Byte = 7

Public Type tRanking
    Value(1 To MAX_TOP) As Long
    Nombre(1 To MAX_TOP) As String
End Type

Public Ranking(1 To MAX_RANKINGS) As tRanking

Public Enum eRanking
    TopFrags = 1
    TopTorneos = 2
    TopLevel = 3
    TopOro = 4
    TopRetos1vs1 = 5
    TopRetos2vs2 = 6
    TopClanes = 7
End Enum



Public Function RenameRanking(ByVal Ranking As eRanking) As String

    '@ Devolvemos el nombre del TAG [] del archivo .DAT
    Select Case Ranking
        Case eRanking.TopClanes
            RenameRanking = "CLANES"
        Case eRanking.TopFrags
            RenameRanking = "FRAGS"
        Case eRanking.TopLevel
            RenameRanking = "NIVEL"
        Case eRanking.TopOro
            RenameRanking = "ORO"
        Case eRanking.TopRetos1vs1
            RenameRanking = "RETOS1VS1"
        Case eRanking.TopRetos2vs2
            RenameRanking = "RETOS2VS2"
        Case eRanking.TopTorneos
            RenameRanking = "TORNEOS"
        Case Else
            RenameRanking = vbNullString
    End Select
End Function
Public Function RenameValue(ByVal UserIndex As Integer, ByVal Ranking As eRanking) As Long
    ' @ Devolvemos a que hace referencia el ranking
    With UserList(UserIndex)
        Select Case Ranking
            Case eRanking.TopClanes
                RenameValue = 0
                'RenameValue = guilds(.GuildIndex).Puntos
            Case eRanking.TopFrags
                RenameValue = .Stats.UsuariosMatados
            Case eRanking.TopLevel
                RenameValue = .Stats.ELV
            Case eRanking.TopOro
                RenameValue = .Stats.GLD
            Case eRanking.TopRetos1vs1
                RenameValue = 0
            Case eRanking.TopRetos2vs2
                RenameValue = 0
            Case eRanking.TopTorneos
                RenameValue = 0
        End Select
    End With
End Function

Public Sub LoadRanking()
    ' @ Cargamos los rankings
   
    Dim LoopI As Integer
    Dim loopX As Integer
    Dim ln As String
   
    For loopX = 1 To MAX_RANKINGS
        For LoopI = 1 To MAX_TOP
            ln = GetVar(App.Path & "\Dat\" & "Ranking.dat", RenameRanking(loopX), "Top" & LoopI)
            Ranking(loopX).Nombre(LoopI) = ReadField(1, ln, 45)
            Ranking(loopX).Value(LoopI) = val(ReadField(2, ln, 45))
        Next LoopI
    Next loopX
   
End Sub
   
Public Sub SaveRanking(ByVal Rank As eRanking)
 ' @ Guardamos el ranking

    Dim LoopI As Integer
   
        For LoopI = 1 To MAX_TOP
            Call WriteVar(DatPath & "Ranking.Dat", RenameRanking(Rank), _
                "Top" & LoopI, Ranking(Rank).Nombre(LoopI) & "-" & Ranking(Rank).Value(LoopI))
        Next LoopI
End Sub

Public Sub CheckRankingUser(ByVal UserIndex As Integer, ByVal Rank As eRanking)
    ' @ Desde aca nos hacemos la siguientes preguntas
    ' @ El personaje está en el ranking?
    ' @ El personaje puede ingresar al ranking?
   
    Dim loopX As Integer
    Dim loopY As Integer
    Dim loopZ As Integer
    Dim Value As Long
    Dim Actualizacion As Byte
    Dim Auxiliar As String
   
    With UserList(UserIndex)
       
        ' @ Not gms
        If EsGM(UserIndex) Then Exit Sub
       
        Value = RenameValue(UserIndex, Rank)
       
        ' @ Si el personaje esta en el ranking actualizamos los valores.
        If .flags.PosRanking <> 0 Then
            If Ranking(Rank).Nombre(.flags.PosRanking) = .name Then
                ' ¿Si está actualizado pa que?
                If Value <> Ranking(Rank).Value(.flags.PosRanking) Then
                    Call ActualizarPosRanking(.flags.PosRanking, Rank, .name, Value)
                   
                    ' @ Chequeamos los datos para actualizar el ranking
                    For loopY = 1 To MAX_TOP
                        For loopZ = 1 To MAX_TOP - loopY
                           
                            If Ranking(Rank).Value(loopZ) < Ranking(Rank).Value(loopZ + 1) Then
                                Auxiliar = Ranking(Rank).Value(loopZ)
                                Ranking(Rank).Value(loopZ) = Ranking(Rank).Value(loopZ + 1)
                                Ranking(Rank).Value(loopZ + 1) = Auxiliar
                                Actualizacion = 1
                            End If
                        Next loopZ
                    Next loopY
                   
                    If Actualizacion <> 0 Then
                        Call SaveRanking(Rank)
                    End If
                End If
            End If
           
            Exit Sub
        End If
       
        ' @ Nos fijamos si podemos ingresar al ranking
        For loopX = 1 To MAX_TOP
            If Value > Ranking(Rank).Value(loopX) Then
                Call ActualizarRanking(loopX, Rank, .name, Value)
                .flags.PosRanking = loopX
                Exit For
            End If
        Next loopX
       
    End With
End Sub

Public Sub ActualizarPosRanking(ByVal Top As Byte, ByVal Rank As eRanking, ByVal UserName As String, ByVal Value As Long)
    ' @ Actualizamos la pos indicada en caso de que el personaje esté en el ranking
    Dim loopX As Integer

    With Ranking(Rank)
        .Value(Top) = Value
        .Nombre(Top) = UserName
    End With
End Sub
Public Sub ActualizarRanking(ByVal Top As Byte, ByVal Rank As eRanking, ByVal UserName As String, ByVal Value As Long)
   
    '@ Actualizamos la lista de ranking
   
    Dim LoopC As Integer
    Dim i As Integer
    Dim j As Integer
    Dim Valor(1 To MAX_TOP) As Long
    Dim Nombre(1 To MAX_TOP) As String

    ' @ Copia necesaria para evitar que se dupliquen repetidamente
    For LoopC = 1 To MAX_TOP
        Valor(LoopC) = Ranking(Rank).Value(LoopC)
        Nombre(LoopC) = Ranking(Rank).Nombre(LoopC)
    Next LoopC
   
    ' @ Corremos las pos, desde el "Top" que es la primera
    For LoopC = Top To MAX_TOP - 1
        Ranking(Rank).Value(LoopC + 1) = Valor(LoopC)
        Ranking(Rank).Nombre(LoopC + 1) = Nombre(LoopC)
    Next LoopC


   
    Ranking(Rank).Nombre(Top) = UserName
    Ranking(Rank).Value(Top) = Value
    Call SaveRanking(Rank)
    Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Ranking de " & RenameRanking(Rank) & "»" & UserName & " ha subido al TOP " & Top & ".", FontTypeNames.FONTTYPE_GUILD))
End Sub
 
C

Crip

Invitado
pregunta shak,el loopc,loopcX y loopcY es para recorrer un bucle,no?
 

ArgentumGame

Dragón Ancestral Lvl 5
Miembro del equipo
Colaborador
Developer
Moderador de AO
Moderador
pregunta shak,el loopc,loopcX y loopcY es para recorrer un bucle,no?
El bucle es el for ... x = 1 to x

Es decir. X seria los valores que va a tomar el bucle desde 1 hasta el x propiamente dicho.

Llamalo si queres recorrer bucle pero el bucle es el for. La variable loopx puede ser x z x f d j s i o la letra que quieras

Enviado desde mi SM-G530M mediante Tapatalk
 
C

Crip

Invitado
El bucle es el for ... x = 1 to x

Es decir. X seria los valores que va a tomar el bucle desde 1 hasta el x propiamente dicho.

Llamalo si queres recorrer bucle pero el bucle es el for. La variable loopx puede ser x z x f d j s i o la letra que quieras

Enviado desde mi SM-G530M mediante Tapatalk
muchas gracias era lo que no entendia!!
 

ArgentumGame

Dragón Ancestral Lvl 5
Miembro del equipo
Colaborador
Developer
Moderador de AO
Moderador
Ya no uso mas el flags, directamente recorro el array que se me pida

Código:
Option Explicit


Public Const MAX_TOP As Byte = 10
Public Const MAX_RANKINGS As Byte = 6

Public Type tRanking
    Value(1 To MAX_TOP) As Long
    Nombre(1 To MAX_TOP) As String
End Type

Public Ranking(1 To MAX_RANKINGS) As tRanking

Public Enum eRanking
    TopFrags = 1
    TopTorneos = 2
    TopLevel = 3
    TopOro = 4
    TopRetos = 5
    TopClanes = 6
End Enum



Public Function RenameRanking(ByVal Ranking As eRanking) As String

    '@ Devolvemos el nombre del TAG [] del archivo .DAT
    Select Case Ranking
        Case eRanking.TopClanes
            RenameRanking = "CLANES"
        Case eRanking.TopFrags
            RenameRanking = "FRAGS"
        Case eRanking.TopLevel
            RenameRanking = "NIVEL"
        Case eRanking.TopOro
            RenameRanking = "ORO"
        Case eRanking.TopRetos
            RenameRanking = "RETOS"
        Case eRanking.TopTorneos
            RenameRanking = "TORNEOS"
        Case Else
            RenameRanking = vbNullString
    End Select
End Function
Public Function RenameValue(ByVal UserIndex As Integer, ByVal Ranking As eRanking) As Long
    ' @ Devolvemos a que hace referencia el ranking
    With UserList(UserIndex)
        Select Case Ranking
            Case eRanking.TopClanes
                RenameValue = 0
                'RenameValue = guilds(.GuildIndex).Puntos
            Case eRanking.TopFrags
                RenameValue = .Stats.UsuariosMatados
            Case eRanking.TopLevel
                RenameValue = .Stats.ELV
            Case eRanking.TopOro
                RenameValue = .Stats.GLD
            Case eRanking.TopRetos
                RenameValue = 0
            Case eRanking.TopTorneos
                RenameValue = 0
        End Select
    End With
End Function

Public Sub LoadRanking()
    ' @ Cargamos los rankings
   
    Dim LoopI As Integer
    Dim loopX As Integer
    Dim ln As String
   
    For loopX = 1 To MAX_RANKINGS
        For LoopI = 1 To MAX_TOP
            ln = GetVar(App.Path & "\Dat\" & "Ranking.dat", RenameRanking(loopX), "Top" & LoopI)
            Ranking(loopX).Nombre(LoopI) = ReadField(1, ln, 45)
            Ranking(loopX).Value(LoopI) = val(ReadField(2, ln, 45))
        Next LoopI
    Next loopX
   
End Sub
   
Public Sub SaveRanking(ByVal Rank As eRanking)
' @ Guardamos el ranking
    Dim LoopI As Integer
   
        For LoopI = 1 To MAX_TOP
            Call WriteVar(DatPath & "Ranking.Dat", RenameRanking(Rank), _
                "Top" & LoopI, Ranking(Rank).Nombre(LoopI) & "-" & Ranking(Rank).Value(LoopI))
        Next LoopI
End Sub

Public Sub CheckRankingUser(ByVal UserIndex As Integer, ByVal Rank As eRanking)
    ' @ Desde aca nos hacemos la siguientes preguntas
    ' @ El personaje está en el ranking?
    ' @ El personaje puede ingresar al ranking?
   
    Dim loopX As Integer
    Dim LoopY As Integer
    Dim loopZ As Integer
    Dim i As Integer
    Dim Value As Long
    Dim Actualizacion As Byte
    Dim Auxiliar As String
    Dim PosRanking As Byte
   
    With UserList(UserIndex)
       
        ' @ Not gms
        If EsGM(UserIndex) Then Exit Sub
       
        Value = RenameValue(UserIndex, Rank)
       
        ' @ Buscamos al personaje en el ranking
        For i = 1 To MAX_TOP
            If Ranking(Rank).Nombre(i) = .name Then
                PosRanking = i
                Exit For
            End If
        Next i
       
        ' @ Si el personaje esta en el ranking actualizamos los valores.
        If PosRanking <> 0 Then
            ' ¿Si está actualizado pa que?
            If Value <> Ranking(Rank).Value(PosRanking) Then
                Call ActualizarPosRanking(PosRanking, Rank, .name, Value)
                   
                ' @ Chequeamos los datos para actualizar el ranking
                For LoopY = 1 To MAX_TOP
                    For loopZ = 1 To MAX_TOP - LoopY
                           
                        If Ranking(Rank).Value(loopZ) < Ranking(Rank).Value(loopZ + 1) Then
                            Auxiliar = Ranking(Rank).Value(loopZ)
                            Ranking(Rank).Value(loopZ) = Ranking(Rank).Value(loopZ + 1)
                            Ranking(Rank).Value(loopZ + 1) = Auxiliar
                            Actualizacion = 1
                        End If
                    Next loopZ
                Next LoopY
                   
                If Actualizacion <> 0 Then
                    Call SaveRanking(Rank)
                End If
            End If
           
            Exit Sub
        End If
       
        ' @ Nos fijamos si podemos ingresar al ranking
        For loopX = 1 To MAX_TOP
            If Value > Ranking(Rank).Value(loopX) Then
                Call ActualizarRanking(loopX, Rank, .name, Value)
                Exit For
            End If
        Next loopX
       
    End With
End Sub

Public Sub ActualizarPosRanking(ByVal Top As Byte, ByVal Rank As eRanking, ByVal UserName As String, ByVal Value As Long)
    ' @ Actualizamos la pos indicada en caso de que el personaje esté en el ranking
    Dim loopX As Integer

    With Ranking(Rank)
        .Value(Top) = Value
        .Nombre(Top) = UserName
    End With
End Sub
Public Sub ActualizarRanking(ByVal Top As Byte, ByVal Rank As eRanking, ByVal UserName As String, ByVal Value As Long)
   
    '@ Actualizamos la lista de ranking
   
    Dim LoopC As Integer
    Dim i As Integer
    Dim j As Integer
    Dim Valor(1 To MAX_TOP) As Long
    Dim Nombre(1 To MAX_TOP) As String
   
    ' @ Copia necesaria para evitar que se dupliquen repetidamente
    For LoopC = 1 To MAX_TOP
        Valor(LoopC) = Ranking(Rank).Value(LoopC)
        Nombre(LoopC) = Ranking(Rank).Nombre(LoopC)
    Next LoopC
   
    ' @ Corremos las pos, desde el "Top" que es la primera
    For LoopC = Top To MAX_TOP - 1
        Ranking(Rank).Value(LoopC + 1) = Valor(LoopC)
        Ranking(Rank).Nombre(LoopC + 1) = Nombre(LoopC)
    Next LoopC


   
    Ranking(Rank).Nombre(Top) = UserName
    Ranking(Rank).Value(Top) = Value
    Call SaveRanking(Rank)
    Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Ranking de " & RenameRanking(Rank) & "»" & UserName & " ha subido al TOP " & Top & ".", FontTypeNames.FONTTYPE_GUILD))
End Sub
 
G

G Toyz

Invitado
Sólo hay que hacer esto para que no se dupliquen usuarios:

*Cadenas manejadas en mayúscula.

Código:
Public Sub CheckRankingUser(ByVal UserIndex As Integer, ByVal Rank As eRanking)

    Dim LoopX As Integer
    Dim LoopY As Integer
    Dim loopZ As Integer
    Dim i As Integer
    Dim Value As Long
    Dim Actualizacion As Byte
    Dim Auxiliar As String
    Dim PosRanking As Byte
    Dim NameUser As String

    With UserList(UserIndex)
        NameUser = UCase$(.name) '<--- Acá)
        ' @ Not gms
        If EsGM(UserIndex) Then Exit Sub
       
        Value = RenameValue(UserIndex, Rank)
       
        ' @ Buscamos al personaje en el ranking
        For i = 1 To MAX_TOP
            If Ranking(Rank).Nombre(i) = NameUser Then
                PosRanking = i
                Exit For
            End If
        Next i
       
        ' @ Si el personaje esta en el ranking actualizamos los valores.
        If PosRanking <> 0 Then
            ' ¿Si está actualizado pa que?
            If Value <> Ranking(Rank).Value(PosRanking) Then
                Call ActualizarPosRanking(PosRanking, Rank, NameUser, Value)
                   
                ' @ Chequeamos los datos para actualizar el ranking
                For LoopY = 1 To MAX_TOP
                    For loopZ = 1 To MAX_TOP - LoopY
                           
                        If Ranking(Rank).Value(loopZ) < Ranking(Rank).Value(loopZ + 1) Then
                            Auxiliar = Ranking(Rank).Value(loopZ)
                            Ranking(Rank).Value(loopZ) = Ranking(Rank).Value(loopZ + 1)
                            Ranking(Rank).Value(loopZ + 1) = Auxiliar
                            Actualizacion = 1
                        End If
                    Next loopZ
                Next LoopY
                   
               If Actualizacion <> 0 Then
                    Call SaveRanking(Rank)
                End If
            End If
           
            Exit Sub
        End If
       
        ' @ Nos fijamos si podemos ingresar al ranking
        For LoopX = 1 To MAX_TOP
            If Value > Ranking(Rank).Value(LoopX) Then
                Call ActualizarRanking(LoopX, Rank, NameUser, Value)
                Exit For
            End If
        Next LoopX
       
    End With
End Sub

Es funcional.
 

ArgentumGame

Dragón Ancestral Lvl 5
Miembro del equipo
Colaborador
Developer
Moderador de AO
Moderador
Claro tambien es algo que me di cuenta en el testeo y lo arregle. Ademas arregle otros detallesitos. Luego actualizo. Ni me acordaba de este sistema. Se agradece el trabajo quw te tomaste en poner el ucase y poner el modulo de nuevo por la mayuscula!

Enviado desde mi SM-G530M mediante Tapatalk
 

Dr. GoDKeR

El Rey y el As
Ex-Staff
Algo no me cierra, el check raknking lo llamarias cada vez que un user pide el /ranking?

Yo en aesir el que armé recorría TODOS los usuarios existentes en la base de datos, cada una hora ( es mas, lo pueden ejecutar una vez al dia si quieren)

Y cuando pedían el rank, solo mandaba los datos, sin tener que recorrer nada ni hacer chequeos.

La consulta a la db demoraba 0.0xxx segundos (y hablamos de una db con mas de 1000 cuentas, asi que imaginate cuantos pjs deberian haber).
 
G

G Toyz

Invitado
Cada vez que se edita algo en el usuario, como: writeupdategold, etc

@MAB, mirá, lo que dijiste vos.


GoDKeR, habría algo mal ahí: Estás chequeando a todos los usuarios existentes, hay usuarios con nivel máximo ponele y se les volvería a chequear o ese char se dejó de usar ponele y también se le chequea. De esta forma sólo se chequea a los usuarios que realmente se editaron. También está que el ranking no se actualiza al instante, o sea al usuario le muestra el mismo ranking de hace unos minutos, eso no lo veo muy lindo.

Otra que queda es guardar en un array todos los usuarios que se modificaron y en un día hacer el checking de sólo los usuarios que están dentro de ese array.
 
M

Miembro

Invitado
Algo no me cierra, el check raknking lo llamarias cada vez que un user pide el /ranking?

Yo en aesir el que armé recorría TODOS los usuarios existentes en la base de datos, cada una hora ( es mas, lo pueden ejecutar una vez al dia si quieren)

Y cuando pedían el rank, solo mandaba los datos, sin tener que recorrer nada ni hacer chequeos.

La consulta a la db demoraba 0.0xxx segundos (y hablamos de una db con mas de 1000 cuentas, asi que imaginate cuantos pjs deberian haber).

GoDKeR pasión.

La tenes adentro Toyz, aguanten los rankings que se ejecutan 1 ves al día y recorren todos los charfiles offline, sin importar si son nivel máximo o no juegan hace 3 años :p.
 

ArgentumGame

Dragón Ancestral Lvl 5
Miembro del equipo
Colaborador
Developer
Moderador de AO
Moderador
Algo no me cierra, el check raknking lo llamarias cada vez que un user pide el /ranking?

Yo en aesir el que armé recorría TODOS los usuarios existentes en la base de datos, cada una hora ( es mas, lo pueden ejecutar una vez al dia si quieren)

Y cuando pedían el rank, solo mandaba los datos, sin tener que recorrer nada ni hacer chequeos.

La consulta a la db demoraba 0.0xxx segundos (y hablamos de una db con mas de 1000 cuentas, asi que imaginate cuantos pjs deberian haber).
No no. El chequeo del ranking deberia hacerse al entrar o desloguear , o ambos. Es a eleccion. hacer un ranking teniendo base de datos es diferente. Yo no se si este codigo lo tiene. para no guardar datos constantemente . Lo que hice es que se guarden loa datos cada cierto.tiempo y se vayan ordenando cuando se necesite pero que el archivo .dat se genere cada x hora. Yo al menos ahora lo trngo 0ara que actualice a las 6 de la tarde y 6 am.

si vos mandas un chequeo por ejemplo en el writeupdategold como dice gtonz se te va a la mierda la eficacia.

Perdom por las faltas no us9 correct9r del celular

Enviado desde mi SM-G530M mediante Tapatalk
 

Dr. GoDKeR

El Rey y el As
Ex-Staff
Cada vez que se edita algo en el usuario, como: writeupdategold, etc

@MAB, mirá, lo que dijiste vos.


GoDKeR, habría algo mal ahí: Estás chequeando a todos los usuarios existentes, hay usuarios con nivel máximo ponele y se les volvería a chequear o ese char se dejó de usar ponele y también se le chequea. De esta forma sólo se chequea a los usuarios que realmente se editaron. También está que el ranking no se actualiza al instante, o sea al usuario le muestra el mismo ranking de hace unos minutos, eso no lo veo muy lindo.

Otra que queda es guardar en un array todos los usuarios que se modificaron y en un día hacer el checking de sólo los usuarios que están dentro de ese array.
Es una locura hacerlo en el writegold, con 100 users questeando o algo, matas al server.

PD: en aesir no habia limite de lvl.
[DOUBLEPOST=1482289129,1482289054][/DOUBLEPOST]
GoDKeR pasión.

La tenes adentro Toyz, aguanten los rankings que se ejecutan 1 ves al día y recorren todos los charfiles offline, sin importar si son nivel máximo o no juegan hace 3 años :p.
Si es un check de charfile, va a convenir hacerlo a una hora donde haya la menor cantidad de usuarios, por que abrir y cerrar 500 archivos o mas va a tardar un par de décadas jaja.
 
G

G Toyz

Invitado
Claro, al loguear o desloguear como dice Shak también.

Igual, no sé si matás al servidor, lo dudo, hay un bucle que recorre a todos los usuarios cada 40ms jaja.

¿Posta? Que vuelva ese proyecto...

PD: Lo del array puede funcionar para lo que decís, GoDKeR.
 
M

Miembro

Invitado
Es una locura hacerlo en el writegold, con 100 users questeando o algo, matas al server.

PD: en aesir no habia limite de lvl.
[DOUBLEPOST=1482289129,1482289054][/DOUBLEPOST]
Si es un check de charfile, va a convenir hacerlo a una hora donde haya la menor cantidad de usuarios, por que abrir y cerrar 500 archivos o mas va a tardar un par de décadas jaja.

Lo que hacía era leer todos los charfiles 1 sola ves, y actualizar datos en otro archivo (datos que iba a utilizar nada más). Después agarraba ese archivo y con ese archivo ordenaba todo y guardaba el top. Todo eso a elección del gm cuando le pintaba actualizar. Pero sí, asumí que iba a tardar 6 décadas.

De todos modos alkon tenía un sistema similar creo, porque updateaban el ranking 1 ves por día.
 

ArgentumGame

Dragón Ancestral Lvl 5
Miembro del equipo
Colaborador
Developer
Moderador de AO
Moderador
Claro, al loguear o desloguear como dice Shak también.

Igual, no sé si matás al servidor, lo dudo, hay un bucle que recorre a todos los usuarios cada 40ms jaja.

¿Posta? Que vuelva ese proyecto...

PD: Lo del array puede funcionar para lo que decís, GoDKeR.
Pero si te fijas ese timer se fue mejorando de version en version..
Si por ejemplo con el dotooeevents no sr iba a la.mierda cuqndo estaba. Ahora lo sacaron y no notas diferencia seguro. Eso no quita que se pueda evitar

Enviado desde mi SM-G530M mediante Tapatalk
 
Arriba