Sistema de retos 1vs1,2vs2. Funcionales y completos.

Ir abajo

Sistema de retos 1vs1,2vs2. Funcionales y completos.

Mensaje por Metrosersuah el 6/1/2017, 6:35 am

en el clientpacketid
ponemos
Código:
   Packet_Retos

bUSCAR
Código:
       Case ClientPacketID.Consultation
            Call HandleConsultation(UserIndex)
            

ABAJO
Código:
       Case ClientPacketID.Packet_Retos
            Call HandlePacketRetos(UserIndex)
            

buscar esto
Sub ResetContadores(ByVal UserIndex As Integer)
Y
abajo van a ver
.hpcounter o algo asi y pongan abajo

Código:
       .CuentaRegresiva = 0
        .ContadorItems = 0

buscar
Public Type UserCounters
abajo

Código:
   ContadorItems As Integer
    CuentaRegresiva As Integer

remplazar este sub

Código:
Private Sub HandleSummonChar(ByVal UserIndex As Integer)
'***************************************************
'Author: Nicolas Matias Gonzalez (NIGO)
'Last Modification: 26/03/2009
'26/03/2009: ZaMa - Chequeo que no se teletransporte donde haya un char o npc
'***************************************************
    If UserList(UserIndex).incomingData.length < 3 Then
        Err.Raise UserList(UserIndex).incomingData.NotEnoughDataErrCode
        Exit Sub
    End If
    
On Error GoTo Errhandler
    With UserList(UserIndex)
        'This packet contains strings, make a copy of the data to prevent losses if it's not complete yet...
        Dim buffer As New clsByteQueue
        Call buffer.CopyBuffer(.incomingData)
        
        'Remove packet ID
        Call buffer.ReadByte
        
        Dim UserName As String
        Dim tUser As Integer
        Dim X As Integer
        Dim Y As Integer
        
        UserName = buffer.ReadASCIIString()
        
        If (.flags.Privilegios And (PlayerType.Admin Or PlayerType.Dios Or PlayerType.SemiDios)) Then
            tUser = NameIndex(UserName)
            
            If tUser <= 0 Then
                Call WriteConsoleMsg(UserIndex, "El jugador no está online.", FontTypeNames.FONTTYPE_INFO)
            ElseIf UserList(tUser).flags.EnEvento > 0 Then
                Call WriteConsoleMsg(UserIndex, "El personaje está en evento.", FontTypeNames.FONTTYPE_INFO)
            Else
                If (.flags.Privilegios And (PlayerType.Dios Or PlayerType.Admin)) <> 0 Or _
                  (UserList(tUser).flags.Privilegios And (PlayerType.Consejero Or PlayerType.User)) <> 0 Then
                    Call WriteConsoleMsg(tUser, .name & " te ha trasportado.", FontTypeNames.FONTTYPE_INFO)
                    X = .Pos.X
                    Y = .Pos.Y + 1
                    Call FindLegalPos(tUser, .Pos.map, X, Y)
                    Call WarpUserChar(tUser, .Pos.map, X, Y, True, True)
                    Call LogGM(.name, "/SUM " & UserName & " Map:" & .Pos.map & " X:" & .Pos.X & " Y:" & .Pos.Y)
                Else
                    Call WriteConsoleMsg(UserIndex, "No puedes invocar a dioses y admins.", FontTypeNames.FONTTYPE_INFO)
                End If
            End If
        End If
        
        'If we got here then packet is complete, copy data back to original queue
        Call .incomingData.CopyBuffer(buffer)
    End With

Errhandler:
    Dim error As Long
    error = Err.Number
On Error GoTo 0
    
    'Destroy auxiliar buffer
    Set buffer = Nothing
    
    If error <> 0 Then _
        Err.Raise error
End Sub

buscar

Código:
'Estadisticas de los usuarios
Public Type UserStats
despues del end type.
ponemos abajo

Código:
Public Enum eEstadoEvento
    Reto_1v1 = 1
    Reto_2v2 = 2
    Reto_3v3 = 3
    
    Torneo_Automatico_1v1 = 4
    Torneo_Automatico_2v2 = 5
    Torneo_Automatico_Death = 6
End Enum



Servidor buscar.
Código:
Public Sub UserDañoUser(ByVal AtacanteIndex As Integer, ByVal VictimaIndex As Integer)

En ese mismo sub buscar.

Código:
           ' Para que las mascotas no sigan intentando luchar y
            ' comiencen a seguir al amo
            Dim j As Integer
            For j = 1 To MAXMASCOTAS
                If .MascotasIndex(j) > 0 Then
                    If Npclist(.MascotasIndex(j)).Target = VictimaIndex Then
                        Npclist(.MascotasIndex(j)).Target = 0
                        Call FollowAmo(.MascotasIndex(j))
                    End If
                End If
            Next j
            
          
            Call ActStats(VictimaIndex, AtacanteIndex)
            
            Call UserDie(VictimaIndex)

Abajo del call userdie victimaindex ponemos lo siguiente

Código:
           '###########EVENTOS#############
            Call mRetos.CombateRetos(AtacanteIndex, VictimaIndex)

En el Sub UserDie(ByVal UserIndex As Integer)
Ponemos.

Código:
       '<< Chequeamos los retos>>
        Select Case .flags.EnEvento
            Case eEstadoEvento.Reto_1v1
               ' Call RevivirUsuariosReto(UserIndex)
                
            Case eEstadoEvento.Reto_2v2, eEstadoEvento.Reto_3v3
                'If mRetos.ChequeoMuertes(UserIndex, .flags.EnEvento) Then
                    'Call RevivirUsuariosReto(UserIndex)
                'End If

En el modúlo protocol colocan.

Código:
Public Sub HandlePacketRetos(ByVal UserIndex As Integer)
    '@ Shak papa
    If UserList(UserIndex).incomingData.length < 2 Then
        Err.Raise UserList(UserIndex).incomingData.NotEnoughDataErrCode
        Exit Sub
    End If
    
On Error GoTo Errhandler
    With UserList(UserIndex)
        'This packet contains strings, make a copy of the data to prevent losses if it's not complete yet...
        Dim buffer As New clsByteQueue
        Call buffer.CopyBuffer(.incomingData)
        
        'Remove packet ID
        Call buffer.ReadByte
        
        Dim Target As String
        Dim TargetPareja As String
        Dim MiPareja As String
        Dim TargetPareja2 As String
        Dim MiPareja2 As String
        Dim Items As Byte
        Dim Oro As Long
        Dim Targets(1 To 6) As Integer
        Dim i As Integer
        Dim PuedeRetar As Boolean
        
        Select Case buffer.ReadByte()
            Case eModalidad.DOSvsDOS
                Oro = buffer.ReadLong()
                Items = buffer.ReadByte()
                Target = buffer.ReadASCIIString()
                MiPareja = buffer.ReadASCIIString()
                TargetPareja = buffer.ReadASCIIString()
                
                
                Targets(1) = UserIndex
                Targets(2) = NameIndex(MiPareja)
                Targets(3) = 0
                
                Targets(4) = NameIndex(Target)
                Targets(5) = NameIndex(TargetPareja)
                Targets(6) = 0
                
                PuedeRetar = True
                For i = 2 To 6
                    If Targets(i) = UserIndex Then
                        PuedeRetar = False
                        Exit For
                    End If
                Next i
                
                If PuedeRetar <> False Then _
                    Call EnviarReto(UserIndex, eModalidad.DOSvsDOS, Targets(), Oro, Items)
            Case eModalidad.TRESvsTRES
                Oro = buffer.ReadLong()
                Items = buffer.ReadByte()
                Target = buffer.ReadASCIIString()
                MiPareja = buffer.ReadASCIIString()
                TargetPareja = buffer.ReadASCIIString()
                TargetPareja2 = buffer.ReadASCIIString()
                MiPareja2 = buffer.ReadASCIIString()
                
                Targets(1) = UserIndex
                Targets(2) = NameIndex(MiPareja)
                Targets(3) = NameIndex(MiPareja2)
                
                Targets(4) = NameIndex(Target)
                Targets(5) = NameIndex(TargetPareja)
                Targets(6) = NameIndex(TargetPareja2)
                
                PuedeRetar = True
                For i = 2 To 6
                    If Targets(i) = UserIndex Then
                        PuedeRetar = False
                        Exit For
                    End If
                Next i
                
                If PuedeRetar <> False Then _
                    Call EnviarReto(UserIndex, eModalidad.TRESvsTRES, Targets(), Oro, Items)
            Case eModalidad.UNOvsUNO
                Oro = buffer.ReadLong()
                Items = buffer.ReadByte()
                Target = buffer.ReadASCIIString()
                
                Targets(1) = UserIndex
                Targets(4) = NameIndex(Target)
                Call EnviarReto(UserIndex, eModalidad.UNOvsUNO, Targets(), Oro, Items)
            Case eModalidad.Aceptar
                Target = buffer.ReadASCIIString()
                
                If Target <> .name Then

                    Call AceptarReto(UserIndex, NameIndex(Target))
                End If
            Case eModalidad.Abandonar
                Call AbandonarEvento(UserIndex)
        End Select
        
        
        'If we got here then packet is complete, copy data back to original queue
        Call .incomingData.CopyBuffer(buffer)
    End With

Errhandler:
    Dim error As Long
    error = Err.Number
On Error GoTo 0
    
    'Destroy auxiliar buffer
    Set buffer = Nothing
    
    If error <> 0 Then _
        Err.Raise error
End Sub

Buscar.

Código:
   If UserList(UserIndex).ComUsu.DestUsu > 0 Then
        If UserList(UserList(UserIndex).ComUsu.DestUsu).flags.UserLogged Then
            If UserList(UserList(UserIndex).ComUsu.DestUsu).ComUsu.DestUsu = UserIndex Then
                Call WriteConsoleMsg(UserList(UserIndex).ComUsu.DestUsu, "Comercio cancelado por el otro usuario", FontTypeNames.FONTTYPE_TALK)
                Call FinComerciarUsu(UserList(UserIndex).ComUsu.DestUsu)
                Call FlushBuffer(UserList(UserIndex).ComUsu.DestUsu)
            End If
        End If

Abajo de eso colocar lo siguiente.

Código:
  ' @ Desconexión en evento
    If UserList(UserIndex).flags.EnEvento > 0 Then
        Call TerminarReto(UserIndex)
    End If
    
   ' If UserList(UserIndex).flags.EnReto > 0 Then
       ' If UserList(UserIndex).flags.EnReto = UNOvsUNO Then
           ' If Retos.UI = UserIndex Then
              '  Call UserDesconectaReto1vs1(UserIndex, Retos.UII)
           ' Else
              '  Call UserDesconectaReto1vs1(UserIndex, Retos.UI)
            'End If
      '  ElseIf UserList(UserIndex).flags.EnReto = DOSvsDOS Then
            'If Retos.UI = UserIndex Or Retos.UII = UserIndex Then
              '  Call UserDesconectaReto2vs2(UserIndex, Retos.UIII)
            'Else
            '    Call UserDesconectaReto2vs2(UserIndex, Retos.UI)
           ' End If
        'End If
   ' End If

En el sub pasarsegundo()
Código:
           ' @ Utilizado para los retos
            If UserList(i).Counters.ContadorItems > 0 Then
                UserList(i).Counters.ContadorItems = UserList(i).Counters.ContadorItems - 1
                
                If UserList(i).Counters.ContadorItems = 0 Then
                    ' @ Mensaje informativo
                    Call WriteConsoleMsg(i, "Tiempo de espera alcanzado. Regresas a la ciudad", FontTypeNames.FONTTYPE_INFO)
                    ' @ Llevamos al ganador a la ciudad
                    Call WarpUserChar(i, UserList(i).flags.RetosUser.PosAnterior.map, UserList(i).flags.RetosUser.PosAnterior.X(1), UserList(i).flags.RetosUser.PosAnterior.Y(1), True)
                    ' @ Quitamos el banco
                    Call QuitarNPC(Retos(UserList(i).flags.RetosUser.ArenaSlot).NpcIndex)
                    ' @ Reseteamos los retos
                    Call ResetCanchaReto(UserList(i).flags.RetosUser.ArenaSlot)
                    Call ResetUserRetos(i)
                End If
            End If
            
            ' @ Cuenta regresiva de retos
            If UserList(i).Counters.CuentaRegresiva > 0 Then
                UserList(i).Counters.CuentaRegresiva = UserList(i).Counters.CuentaRegresiva - 1
                
                Select Case UserList(i).Counters.CuentaRegresiva
                    Case 0
                        Call WriteConsoleMsg(i, "¡¡A luchar!!", FontTypeNames.FONTTYPE_FIGHT)
                    Case Else
                        Call WriteConsoleMsg(i, "Conteo» " & UserList(i).Counters.CuentaRegresiva & ".", FontTypeNames.FONTTYPE_GUILD)
                End Select
                
            End If

En el sub main()
va a ver una parte donde este esto.
   Call LoadMotd

Ahí abajo de esa linea colocan esto.

Código:
   Call LoadArenasReto


buscar.
'flags
Public Type UserFlags

Abajo de eso y arriba de
   Muerto As Byte '¿Esta muerto?
Colocan lo siguiente
Código:
   EnEvento As eEstadoEvento
    EnEvento As eEstadoEvento
    RetosUser As tRetosUser
    Contrincante As Integer
    Ofreciendoo As Integer
    LeOfrecieronn As Integer
    Plantando As Integer
    PrecioPlante As Long
    DueloGanado As Byte

Agregar el siguiente modúlo al proyecto. con el nombre "mRetos"
Modúlo:

Código:
' 12/10/2016
' Sistema re-hecho

Private Type tRetosMap
    map As Integer
    X(1 To 2) As Byte
    Y(1 To 2) As Byte
    Ocupado As Byte
End Type

' Datos de los usuarios
Public Type tRetosUser
    PosAnterior As tRetosMap
    Targets(1 To 6) As Integer
    Oferta_Oro As Long
    Oferta_Items As Byte
    Oferta_Modalidad As eModalidad
    ArenaSlot As Byte '@ Slot en el que están
    Oferta_Aceptadas As Byte
    'RoundsGanados As Byte
    TeamIndex As Byte  ' 1 o 2
    Parejas(1 To 2) As Integer
    
    ' @ Index de uno de los enemigos para usarlos al ganar
    Enemigo As Integer
End Type

' Datos del reto
Private Type tRetos
    Targets(1 To 6) As Integer
    Items As Byte
    Oro As Long
    NpcIndex As Integer
    Rounds(1 To 2) As Byte 'Team 1 , Team 2
End Type

Public Enum eModalidad
    UNOvsUNO = 1
    DOSvsDOS = 2
    TRESvsTRES = 3
    Aceptar = 4
    Abandonar = 5
End Enum

Public Modalidad As eModalidad

Private Const MAX_ARENAS As Byte = 27

Public Retos(1 To MAX_ARENAS) As tRetos
Public Arenas(1 To MAX_ARENAS) As tRetosMap

Public Sub LoadArenasReto()
    Call SetArenas(1, 142, 19, 17, 35, 29)
    Call SetArenas(2, 142, 46, 17, 62, 29)
    Call SetArenas(3, 142, 73, 17, 89, 29)
    Call SetArenas(4, 142, 19, 42, 35, 54)
    Call SetArenas(5, 142, 46, 42, 62, 54)
    Call SetArenas(6, 142, 73, 42, 89, 54)
    Call SetArenas(7, 142, 19, 68, 35, 79)
    Call SetArenas(8, 142, 46, 68, 62, 79)
    Call SetArenas(9, 142, 73, 68, 89, 79)
    
    Call SetArenas(10, 143, 19, 17, 35, 29)
    Call SetArenas(11, 143, 46, 17, 62, 29)
    Call SetArenas(12, 143, 73, 17, 89, 29)
    Call SetArenas(13, 143, 19, 42, 35, 54)
    Call SetArenas(14, 143, 46, 42, 62, 54)
    Call SetArenas(15, 143, 73, 42, 89, 54)
    Call SetArenas(16, 143, 19, 68, 35, 79)
    Call SetArenas(17, 143, 46, 68, 62, 79)
    Call SetArenas(18, 143, 73, 68, 89, 79)
    
    Call SetArenas(19, 144, 19, 17, 35, 29)
    Call SetArenas(20, 144, 46, 17, 62, 29)
    Call SetArenas(21, 144, 73, 17, 89, 29)
    Call SetArenas(22, 144, 19, 42, 35, 54)
    Call SetArenas(23, 144, 46, 42, 62, 54)
    Call SetArenas(24, 144, 73, 42, 89, 54)
    Call SetArenas(25, 144, 19, 68, 35, 79)
    Call SetArenas(26, 144, 46, 68, 62, 79)
    Call SetArenas(27, 144, 73, 68, 89, 79)
End Sub
Private Sub SetArenas(ByVal index As Byte, ByVal map As Byte, ByVal Team1_X As Byte, ByVal Team1_Y As Byte, ByVal Team2_X As Byte, ByVal Team2_Y As Byte)
    ' @ Seteamos las arenas
    
    With Arenas(index)
        .map = map
        .X(1) = Team1_X
        .X(2) = Team2_X
        .Y(1) = Team1_Y
        .Y(2) = Team2_Y
    End With
End Sub

Private Function BuscarArena() As Byte
    ' @ Buscamos una arena libre para efectuar el reto
    Dim i As Integer
    
    For i = 1 To MAX_ARENAS
        If Arenas(i).Ocupado <> 1 Then
            BuscarArena = i
            Exit For
        End If
    Next i
End Function
Public Sub ResetCanchaReto(ByVal IndexArena As Byte)

    ' @ Reseteamos la cancha
    Dim i As Integer
        
    With Retos(IndexArena)
        .Items = 0
        .Oro = 0
        .NpcIndex = 0
        .Rounds(1) = 0
        .Rounds(2) = 0
        
        For i = 1 To 6
            .Targets(i) = 0
        Next i
    End With
    
    Arenas(IndexArena).Ocupado = 0
End Sub


Private Function PuedeRetar(ByVal UserIndex As Integer, ByRef Players() As Integer, ByVal Oro As Long) As Boolean
    
    ' ¿El personaje puede retar?
    
    Dim i As Integer
    
    PuedeRetar = True
    
    For i = 1 To 6
        If Players(i) <> 0 Then
            With UserList(Players(i))
                If .flags.UserLogged = False Then
                     Call WriteConsoleMsg(UserIndex, "El personaje " & UserList(Players(i)).name & " se encuentra offline.", FontTypeNames.FONTTYPE_INFO)
                     PuedeRetar = False
                     Exit Function
                End If
                
                If .flags.Muerto Then
                     Call WriteConsoleMsg(Players(i), "No puedes jugar el reto estando muerto", FontTypeNames.FONTTYPE_INFO)
                     Call WriteConsoleMsg(UserIndex, "El personaje " & UserList(Players(i)).name & " está muerto.", FontTypeNames.FONTTYPE_INFO)
                     PuedeRetar = False
                     Exit Function
                End If
                
                If .Counters.Pena > 0 Then
                    Call WriteConsoleMsg(Players(i), "No puedes jugar desde la carcel", FontTypeNames.FONTTYPE_INFO)
                    Call WriteConsoleMsg(UserIndex, "El personaje " & UserList(Players(i)).name & " está en la carcel.", FontTypeNames.FONTTYPE_INFO)
                    PuedeRetar = False
                    Exit Function
                End If
                
                If .Stats.GLD < Oro Then
                    Call WriteConsoleMsg(Players(i), "No tienes suficientes monedas de oro para el evento.", FontTypeNames.FONTTYPE_INFO)
                    Call WriteConsoleMsg(UserIndex, "El personaje " & UserList(Players(i)).name & " no tiene suficientes monedas de oro.", FontTypeNames.FONTTYPE_INFO)
                    PuedeRetar = False
                    Exit Function
                End If
                
                If .Pos.map <> Ullathorpe.map Then
                    Call WriteConsoleMsg(Players(i), "Para participar de los eventos debes estar en ullathorpe", FontTypeNames.FONTTYPE_INFO)
                    Call WriteConsoleMsg(UserIndex, "El personaje " & UserList(Players(i)).name & " no se encuentra en la ciudad.", FontTypeNames.FONTTYPE_INFO)
                    PuedeRetar = False
                    Exit Function
                End If
                    
            End With
        End If
    Next i
End Function

Public Sub EnviarReto(ByVal UserIndex As Integer, ByVal Modalidad As eModalidad, ByRef Targets() As Integer, ByVal Oro As Long, ByVal Items As Byte)

    ' @ Enviamos el reto
    
    Dim Team1 As String
    Dim Team2 As String
    Dim i As Integer
    
    With UserList(UserIndex)
        If PuedeRetar(UserIndex, Targets(), Oro) Then
            Select Case Modalidad
                Case eModalidad.UNOvsUNO
                    ' @ Reseteamos los datos anteriores
                    Call ResetUserRetos(UserIndex)
                    
                    ' @ Guardamos los datos necesarios para la solicitud del reto
                    .flags.RetosUser.Targets(1) = Targets(1)
                    .flags.RetosUser.Targets(4) = Targets(4)
                    
                    .flags.RetosUser.Oferta_Items = Items
                    .flags.RetosUser.Oferta_Oro = Oro
                    .flags.RetosUser.Oferta_Modalidad = UNOvsUNO
                    
                    ' @ Mensaje de invitación
                    Call WriteConsoleMsg(Targets(4), "El personaje " & .name & _
                        " te reta a un duelo 1vs1. Para aceptar tipea /ACEPTAR " & .name & ". Apuesta por " & Oro & " monedas de oro" & IIf(Items > 0, " y los items.", "."), FontTypeNames.FONTTYPE_INFO)
                    Call WriteConsoleMsg(UserIndex, "Has enviado solicitud de reto a " & UserList(Targets(4)).name & ".", FontTypeNames.FONTTYPE_INFO)
                    

                Case eModalidad.DOSvsDOS
                    ' @ Reseteamos los datos anteriores
                    Call ResetUserRetos(UserIndex)
                    
                    Team1 = UserList(Targets(1)).name & "-" & UserList(Targets(2)).name
                    Team2 = UserList(Targets(4)).name & "-" & UserList(Targets(5)).name
                    
                    ' @ Guardamos los datos necesarios para la solicitud del reto
                    .flags.RetosUser.Oferta_Modalidad = DOSvsDOS
                    .flags.RetosUser.Targets(1) = Targets(1)
                    .flags.RetosUser.Targets(2) = Targets(2)
                    .flags.RetosUser.Targets(4) = Targets(4)
                    .flags.RetosUser.Targets(5) = Targets(5)
                    
                    ' @ Mensajes informativos
                    Call WriteConsoleMsg(Targets(2), "Retos 2vs2» " & Team1 & " vs " & Team2 & ". Para aceptar tipea /ACEPTAR " & .name & ". Apuesta por " & Oro & " monedas de oro" & IIf(Items > 0, " y los items.", "."), FontTypeNames.FONTTYPE_INFO)
                    Call WriteConsoleMsg(Targets(4), "Retos 2vs2» " & Team1 & " vs " & Team2 & ". Para aceptar tipea /ACEPTAR " & .name & ". Apuesta por " & Oro & " monedas de oro" & IIf(Items > 0, " y los items.", "."), FontTypeNames.FONTTYPE_INFO)
                    Call WriteConsoleMsg(Targets(5), "Retos 2vs2» " & Team1 & " vs " & Team2 & ". Para aceptar tipea /ACEPTAR " & .name & ". Apuesta por " & Oro & " monedas de oro" & IIf(Items > 0, " y los items.", "."), FontTypeNames.FONTTYPE_INFO)
                    Call WriteConsoleMsg(UserIndex, "Has enviado solicitud de reto a " & UserList(Targets(2)).name & " para ser tu compañero y enfrentarte a " & _
                        UserList(Targets(4)).name & " y " & UserList(Targets(5)).name & ".", FontTypeNames.FONTTYPE_INFO)
                
                Case eModalidad.TRESvsTRES
                    ' @ Reseteamos los datos anteriores
                    Call ResetUserRetos(UserIndex)
                    
                    Team1 = UserList(Targets(1)).name & "-" & UserList(Targets(2)).name & "-" & UserList(Targets(3)).name
                    Team2 = UserList(Targets(4)).name & "-" & UserList(Targets(5)).name & "-" & UserList(Targets(6)).name
                    
                    .flags.RetosUser.Oferta_Modalidad = TRESvsTRES
                    
                    '@ Guardamos los targets y enviamos los mensajes informativos
                    For i = 2 To 6
                        .flags.RetosUser.Targets(i) = Targets(i)
                        Call WriteConsoleMsg(Targets(i), "Retos 3vs3» " & Team1 & " vs " & Team2 & ". Para aceptar tipea /ACEPTAR " & .name & ". Apuesta por " & Oro & " monedas de oro" & IIf(Items > 0, " y los items.", "."), FontTypeNames.FONTTYPE_INFO)
                    Next i
                    
                    Call WriteConsoleMsg(UserIndex, "Has enviado solicitud de reto a " & UserList(Targets(2)).name & " y " & UserList(Targets(3)).name & _
                        " para que sean tus compañeros y enfrentarte a " & UserList(Targets(4)).name & " , " & _
                        UserList(Targets(5)).name & " y " & UserList(Targets(6)).name & ".", FontTypeNames.FONTTYPE_INFO)
            End Select
        End If
    End With
End Sub

Public Sub ResetUserRetos(ByVal UserIndex As Integer)

    ' @ Reseteamos los datos del usuario del reto.
    With UserList(UserIndex).flags.RetosUser
        .ArenaSlot = 0
        .Oferta_Aceptadas = 0
        .Oferta_Items = 0
        .Oferta_Modalidad = 0
        .Oferta_Oro = 0
        .Parejas(1) = 0
        .Parejas(2) = 0
        .PosAnterior.map = 0
        .PosAnterior.X(1) = 0
        .PosAnterior.Y(1) = 0
        .TeamIndex = 0
        .Enemigo = 0
        
        Dim i As Integer
        For i = 1 To 6
            .Targets(i) = 0
        Next i
    End With
    
    UserList(UserIndex).flags.EnEvento = 0
End Sub

Public Sub ResetearStatsReto(ByVal UserIndex As Integer)
    ' @ Desde acá sacamos todos los efectos que tenga el usuario.
    With UserList(UserIndex)
        Call WriteUpdateUserStats(UserIndex)
        
        If .flags.Inmovilizado > 0 Then
            .flags.Inmovilizado = 0
        End If
        
        If .flags.Estupidez > 0 Then
            .flags.Estupidez = 0
        End If
        
        If .flags.Paralizado = 1 Then
            .flags.Paralizado = 0
            .Counters.Paralisis = 0
            Call WriteParalizeOK(UserIndex)
        End If
        
        .flags.Oculto = 0
        .flags.invisible = 0
        .Counters.TiempoOculto = 0
        .Counters.Invisibilidad = 0

        'Call SetInvisible(UserIndex, UserList(UserIndex).Char.CharIndex, False)
        
    End With
End Sub
Public Sub EnviarCuentaRegresiva(ByVal UserIndex As Integer)

    ' @@ Enviamos la cuenta regresiva al personaje en combate.
    
    With UserList(UserIndex)
        Call WriteConsoleMsg(UserIndex, "«Cuenta regresiva para comenzar el duelo»", FontTypeNames.FONTTYPE_FIGHT)
        .Counters.CuentaRegresiva = 11
    End With
End Sub

Public Sub AsignarFlagsReto(ByVal UserIndex As Integer, ByVal Modalidad As Byte, ByVal ArenaIndex As Byte, ByVal Enemigo As Integer)

    ' Guardamos los datos del PJ
    With UserList(UserIndex)
        .flags.EnEvento = Modalidad
        .flags.RetosUser.PosAnterior.map = .Pos.map
        .flags.RetosUser.PosAnterior.X(1) = .Pos.X
        .flags.RetosUser.PosAnterior.Y(1) = .Pos.Y
        .flags.RetosUser.ArenaSlot = ArenaIndex
        .flags.RetosUser.Enemigo = Enemigo
    End With
    
    
    ' @@ Reseteamos los stats del personaje
    ResetearStatsReto UserIndex
End Sub
Public Sub AsignarDatosArena(ByVal IndexArena As Byte, ByVal Target As Integer, ByRef Targets() As Integer)
    ' @ Llenamos los datos de la arena
    
    Dim i As Integer
    
    Arenas(IndexArena).Ocupado = 1
    
    With Retos(IndexArena)
        For i = 1 To 6
            .Targets(i) = Targets(i)
        Next i
        
        .Items = UserList(Target).flags.RetosUser.Oferta_Items
        .Oro = UserList(Target).flags.RetosUser.Oferta_Oro
    End With
End Sub
Public Function DetectarGanador(ByVal UserIndex As Integer) As Integer
    ' @ Lo que hace esta función es detectar el Index del ganador, descartando chars
    
    With UserList(UserIndex)
        Dim ArenaIndex As Byte
        ArenaIndex = .flags.RetosUser.ArenaSlot
        
        ' @ Si el perdedor no está entre el team 1, significa
        If Retos(ArenaIndex).Targets(1) = UserIndex Or _
            Retos(ArenaIndex).Targets(2) = UserIndex Or _
            Retos(ArenaIndex).Targets(3) = UserIndex Then
                
            DetectarGanador = Retos(ArenaIndex).Targets(4)
        Else
            DetectarGanador = Retos(ArenaIndex).Targets(1)
        End If
    End With
End Function
Public Sub TerminarReto(ByVal UserIndex As Integer)
    ' @ Utilizado para cuando un usuario abandona y/o deslogea
    Dim Ganador As Integer
    Dim Msj As String
    Dim ArenaSlot As Byte
    
    With UserList(UserIndex)
        Ganador = DetectarGanador(UserIndex)
        ArenaSlot = .flags.RetosUser.ArenaSlot
        
        ' @ Si abandona el reto o deslogea. El premio se da igual!!
        
        
        Select Case .flags.EnEvento
            Case eEstadoEvento.Reto_1v1
                Msj = "Retos 1vs1» " & UserList(Retos(ArenaSlot).Targets(1)).name & " vs " & UserList(Retos(ArenaSlot).Targets(4)).name & ". El ganador es " & UserList(Ganador).name & "."
            Case eEstadoEvento.Reto_2v2
                Msj = "Retos 2vs2» " & UserList(Retos(ArenaSlot).Targets(1)).name & " y " & UserList(Retos(ArenaSlot).Targets(2)).name & " vs " & UserList(Retos(ArenaSlot).Targets(4)).name & " y " & UserList(Retos(ArenaSlot).Targets(5)).name & ".  El ganador es el equipo de " & UserList(Ganador).name & "."
            Case eEstadoEvento.Reto_3v3
                Msj = "Retos 2vs2» " & UserList(Retos(ArenaSlot).Targets(1)).name & ", " & UserList(Retos(ArenaSlot).Targets(2)).name & " y " & UserList(Retos(ArenaSlot).Targets(3)).name & " vs " & UserList(Retos(ArenaSlot).Targets(4)).name & ", " & UserList(Retos(ArenaSlot).Targets(5)).name & " y " & UserList(Retos(ArenaSlot).Targets(6)).name & ".  El ganador es el equipo de " & UserList(Ganador).name & "."
        End Select
        
        Call mRetos.PremiosReto(Ganador, UserIndex, Retos(ArenaSlot).Oro, Retos(ArenaSlot).Items)
        Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg(Msj, FontTypeNames.FONTTYPE_GUILD))
    End With
End Sub
Public Sub AbandonarEvento(ByVal UserIndex As Integer)
    With UserList(UserIndex)
        If .Counters.ContadorItems > 0 Then
            Call QuitarNPC(Retos(.flags.RetosUser.ArenaSlot).NpcIndex)
            Call WarpUserChar(UserIndex, .flags.RetosUser.PosAnterior.map, .flags.RetosUser.PosAnterior.X(1), .flags.RetosUser.PosAnterior.Y(1), False)
            Call ResetUserRetos(UserIndex)
        
        ElseIf .flags.EnEvento > 0 Then
            Select Case .flags.EnEvento
                ' @ Retos entre usuario
                Case eEstadoEvento.Reto_1v1, eEstadoEvento.Reto_2v2, eEstadoEvento.Reto_3v3
                    Call TerminarReto(UserIndex)
                
                ' @ Eventos automaticos
                Case eEstadoEvento.Torneo_Automatico_1v1, eEstadoEvento.Torneo_Automatico_2v2, eEstadoEvento.Torneo_Automatico_Death
            End Select
        End If
    End With
End Sub

Public Sub AsignarParejasReto(ByRef Targets() As Integer)
    ' @@ Parejas 2vs2
    
    ' @ Team 1
    UserList(Targets(1)).flags.RetosUser.Parejas(1) = Targets(2)
    UserList(Targets(2)).flags.RetosUser.Parejas(1) = Targets(1)
    
    ' @ Team 2
    UserList(Targets(4)).flags.RetosUser.Parejas(1) = Targets(5)
    UserList(Targets(5)).flags.RetosUser.Parejas(1) = Targets(4)
    

    ' @@ Parejas 3vs3
    If Targets(3) <> 0 Then
        ' @ Team 1
        UserList(Targets(3)).flags.RetosUser.Parejas(1) = Targets(1)
        UserList(Targets(3)).flags.RetosUser.Parejas(2) = Targets(2)
        UserList(Targets(1)).flags.RetosUser.Parejas(2) = Targets(3)
        UserList(Targets(2)).flags.RetosUser.Parejas(2) = Targets(3)
        
        ' @ Team 2
        UserList(Targets(4)).flags.RetosUser.Parejas(2) = Targets(6)
        UserList(Targets(5)).flags.RetosUser.Parejas(1) = Targets(6)
        UserList(Targets(6)).flags.RetosUser.Parejas(1) = Targets(4)
        UserList(Targets(6)).flags.RetosUser.Parejas(2) = Targets(5)
    End If
End Sub
Public Sub GuardarTeamIndex(ByVal UserIndex As Integer, ByVal UserIndex2 As Integer)
    ' @ Guardamos el TeamIndex al UserIndex
    ' @ Usado para rounds ganados
    
    ' Team 1
    With UserList(UserIndex)
        .flags.RetosUser.TeamIndex = 1
        
        ' ¿Parejas?
        If .flags.RetosUser.Parejas(1) <> 0 Then
            UserList(.flags.RetosUser.Parejas(1)).flags.RetosUser.TeamIndex = 1
        End If
        
        ' ¿Parejas?
        If .flags.RetosUser.Parejas(2) <> 0 Then
            UserList(.flags.RetosUser.Parejas(2)).flags.RetosUser.TeamIndex = 1
        End If
    End With
    
    ' Team 2
    With UserList(UserIndex2)
        .flags.RetosUser.TeamIndex = 2
        
        ' ¿Parejas?
        If .flags.RetosUser.Parejas(1) <> 0 Then
            UserList(.flags.RetosUser.Parejas(1)).flags.RetosUser.TeamIndex = 2
        End If
        
        ' ¿Parejas?
        If .flags.RetosUser.Parejas(2) <> 0 Then
            UserList(.flags.RetosUser.Parejas(2)).flags.RetosUser.TeamIndex = 2
        End If
    End With
End Sub
Public Sub AceptarReto(ByVal UserIndex As Integer, ByVal Target As Integer)
    ' @ Aceptamos el reto
    With UserList(UserIndex)
        Dim i As Integer
        Dim SlotLibre As Byte
        Dim Targets() As Integer
        Dim PuedeAceptar As Boolean
        
        
        '  El mismo usuario no puede auto aceptarse
        If UserIndex = Target Then Exit Sub
        
        '  Target inexistente u offline.
        If Target = 0 Then
            Call WriteConsoleMsg(UserIndex, "El personaje no existe o no se encuentra online.", FontTypeNames.FONTTYPE_INFO)
            Exit Sub
        End If
        
        '  ¿ El personaje al que queremos aceptar, es el que nos envió ?
        For i = 2 To 6
            If UserList(Target).flags.RetosUser.Targets(i) = UserIndex Then
                PuedeAceptar = True
                Exit For
            End If
        Next i
        
        If PuedeAceptar = False Then
            Call WriteConsoleMsg(UserIndex, "El personaje no te invitó a participar en ningún reto.", FontTypeNames.FONTTYPE_INFO)
            Exit Sub
        End If
        
        ' Chequeamos que puedan retar todos los que se encuentren involucrados en el reto
        If PuedeRetar(UserIndex, UserList(Target).flags.RetosUser.Targets(), UserList(Target).flags.RetosUser.Oferta_Oro) Then
            Targets() = UserList(Target).flags.RetosUser.Targets()
            SlotLibre = BuscarArena
            
            ' No hay arenas libres
            If SlotLibre = 0 Then
                Call WriteConsoleMsg(UserIndex, "No hay arenas disponibles para llevar a cabo el enfrentanmiento", FontTypeNames.FONTTYPE_INFO)
                Exit Sub
            End If
            
            ' Guardamos el TeamIndex
            Call mRetos.GuardarTeamIndex(Targets(1), Targets(4))
            
            Select Case UserList(Target).flags.RetosUser.Oferta_Modalidad
                Case eModalidad.UNOvsUNO
                    '  Guardamos los flags del reto
                    Call mRetos.AsignarFlagsReto(Target, eEstadoEvento.Reto_1v1, SlotLibre, UserIndex)
                    Call mRetos.AsignarFlagsReto(UserIndex, eEstadoEvento.Reto_1v1, SlotLibre, Target)
                        
                    '  Guardamos los datos de la arena
                    Call mRetos.AsignarDatosArena(SlotLibre, Target, Targets())
                        
                    '  Empezamos el combate
                    Call mRetos.EmpezarCombate(Targets(1), Targets(4), SlotLibre)
                        
                    '  Flodeo a los demás
                    Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Retos 1vs1» El personaje " & UserList(Targets(1)).name & " se enfrenta a " & UserList(Targets(4)).name & ".", FontTypeNames.FONTTYPE_GUILD))
                    
                Case eModalidad.DOSvsDOS
                    UserList(Target).flags.RetosUser.Oferta_Aceptadas = UserList(Target).flags.RetosUser.Oferta_Aceptadas + 1
                    Call WriteConsoleMsg(UserIndex, "Has aceptado el reto. Ahora debes esperar que los demás personajes acepten.", FontTypeNames.FONTTYPE_INFO)
                        
                    '¿Aceptaron todos?
                    If UserList(Target).flags.RetosUser.Oferta_Aceptadas = 3 Then
                        ' @ Guardamos los datos de los personajes
                        Call mRetos.AsignarFlagsReto(Targets(1), eEstadoEvento.Reto_2v2, SlotLibre, Targets(4))
                        Call mRetos.AsignarFlagsReto(Targets(2), eEstadoEvento.Reto_2v2, SlotLibre, Targets(4))
                        Call mRetos.AsignarFlagsReto(Targets(4), eEstadoEvento.Reto_2v2, SlotLibre, Targets(1))
                        Call mRetos.AsignarFlagsReto(Targets(5), eEstadoEvento.Reto_2v2, SlotLibre, Targets(1))

                        ' @ Guardamos la pareja de cada personaje para futuros usos
                        Call mRetos.AsignarParejasReto(Targets())
                            
                        ' @ Guardamos los datos de la arena
                        Call mRetos.AsignarDatosArena(SlotLibre, Target, Targets())
                            
                        ' @ Sumoneamos a los personajes
                        Call mRetos.EmpezarCombate(Targets(1), Targets(4), SlotLibre)
                    End If
                        
                Case eModalidad.TRESvsTRES
                    UserList(Target).flags.RetosUser.Oferta_Aceptadas = UserList(Target).flags.RetosUser.Oferta_Aceptadas + 1
                        
                    Call WriteConsoleMsg(UserIndex, "Has aceptado el reto. Ahora debes esperar que los demás personajes acepten.", FontTypeNames.FONTTYPE_INFO)
                        
                    '¿Aceptaron todos?
                    If UserList(Target).flags.RetosUser.Oferta_Aceptadas = 5 Then
                        '  Guardamos los datos del personaje
                        Call mRetos.AsignarFlagsReto(Targets(1), eEstadoEvento.Reto_3v3, SlotLibre, Targets(4))
                        Call mRetos.AsignarFlagsReto(Targets(2), eEstadoEvento.Reto_3v3, SlotLibre, Targets(4))
                        Call mRetos.AsignarFlagsReto(Targets(3), eEstadoEvento.Reto_3v3, SlotLibre, Targets(4))
                        Call mRetos.AsignarFlagsReto(Targets(4), eEstadoEvento.Reto_3v3, SlotLibre, Targets(1))
                        Call mRetos.AsignarFlagsReto(Targets(5), eEstadoEvento.Reto_3v3, SlotLibre, Targets(1))
                        Call mRetos.AsignarFlagsReto(Targets(6), eEstadoEvento.Reto_3v3, SlotLibre, Targets(1))
                            
                        '  Guardamos las parejas
                        Call mRetos.AsignarParejasReto(Targets())
                            
                        '  Asignamos los datos a la arena
                        Call mRetos.AsignarDatosArena(SlotLibre, Target, Targets())
                            
                        '  Empezamos el combate
                        Call mRetos.EmpezarCombate(Targets(1), Targets(4), SlotLibre)
                    End If
            End Select
        End If
    End With
End Sub

Public Sub PremiosReto(ByVal Ganador As Integer, ByVal Perdedor As Integer, ByVal Oro As Long, ByVal Items As Byte)
    
    Dim Pareja(1 To 2) As Integer
    
    ' @@ Usuario ganador del reto
    With UserList(Ganador)
        ' @ Le agregamos el oro
        .Stats.GLD = .Stats.GLD + Oro
        Call WriteUpdateGold(Ganador)
        
        ' @ Si es por items le sumoneamos un NPC
        If Items > 0 Then
            .Counters.ContadorItems = 20
            NpcIndex = SpawnNpc(24, .Pos, False, False)
            Retos(.flags.RetosUser.ArenaSlot).NpcIndex = NpcIndex
        Else '@ Sino lo regresamos
            Call WarpUserChar(Ganador, .flags.RetosUser.PosAnterior.map, .flags.RetosUser.PosAnterior.X(1), .flags.RetosUser.PosAnterior.Y(1), False)
        End If
        
        ' @ El personaje tiene una pareja
        If .flags.RetosUser.Parejas(1) <> 0 Then
            Pareja(1) = .flags.RetosUser.Parejas(1)
            UserList(Pareja(1)).Stats.GLD = UserList(Pareja(1)).Stats.GLD + Oro
            Call WriteUpdateGold(Pareja(1))
            
            If Items > 0 Then
                UserList(Pareja(1)).Counters.ContadorItems = 20
            Else
                Call WarpUserChar(Pareja(1), UserList(Pareja(1)).flags.RetosUser.PosAnterior.map, UserList(Pareja(1)).flags.RetosUser.PosAnterior.X(1), UserList(Pareja(1)).flags.RetosUser.PosAnterior.Y(1), False)
                ResetUserRetos Pareja(1)
            End If
        End If
        
        ' @ El personaje tiene otra pareja
        If .flags.RetosUser.Parejas(2) <> 0 Then
            Pareja(2) = .flags.RetosUser.Parejas(2)
            UserList(Pareja(2)).Stats.GLD = UserList(Pareja(2)).Stats.GLD + Oro
            Call WriteUpdateGold(.flags.RetosUser.Parejas(2))
            
            If Items > 0 Then
                UserList(Pareja(2)).Counters.ContadorItems = 20
            Else
                Call WarpUserChar(Pareja(2), UserList(Pareja(2)).flags.RetosUser.PosAnterior.map, UserList(Pareja(2)).flags.RetosUser.PosAnterior.X(1), UserList(Pareja(2)).flags.RetosUser.PosAnterior.Y(1), False)
                ResetUserRetos Pareja(2)
            End If
        End If

    End With
    
    
    ' @@ Usuario/s perdedor/es
    With UserList(Perdedor)
    
        ' @ Le restamos la cantidad de oro por la que retamos
        .Stats.GLD = .Stats.GLD - Oro
        Call WriteUpdateGold(Perdedor)

        ' @ Si el reto es por items los tiramos antes de llevarlo
        If Items > 0 Then Call TirarTodosLosItems(Perdedor)
        
        ' @ Llevamos a los personajes o a el personaje perdedor.
        Call WarpUserChar(Perdedor, .flags.RetosUser.PosAnterior.map, .flags.RetosUser.PosAnterior.X(1), .flags.RetosUser.PosAnterior.Y(1), False)
        
        ' @ El personaje perdedor tiene pareja?
        If .flags.RetosUser.Parejas(1) <> 0 Then
            Pareja(1) = .flags.RetosUser.Parejas(1)
            
            ' @ Le quitamos el oro
            UserList(Pareja(1)).Stats.GLD = UserList(Pareja(1)).Stats.GLD - Oro
            Call WriteUpdateGold(Pareja(1))
            
            ' @ Le quitamos los items
            If Items > 0 Then Call TirarTodosLosItems(Pareja(1))
            
            ' @ Lo regresamos a su posición anterior
            Call WarpUserChar(Pareja(1), UserList(Pareja(1)).flags.RetosUser.PosAnterior.map, UserList(Pareja(1)).flags.RetosUser.PosAnterior.X(1), UserList(Pareja(1)).flags.RetosUser.PosAnterior.Y(1), False)
            
            ' @ Reseteamos los flags de retos del personaje.
            Call ResetUserRetos(Pareja(1))
        End If
        
        ' @ El personaje perdedor tiene una segunda pareja?
        If .flags.RetosUser.Parejas(2) <> 0 Then
            Pareja(2) = .flags.RetosUser.Parejas(2)
            
            ' @ Le quitamos el oro
            UserList(Pareja(2)).Stats.GLD = UserList(Pareja(2)).Stats.GLD - Oro
            Call WriteUpdateGold(Pareja(2))
            
            ' @ Le quitamos los objetos
            If Items > 0 Then Call TirarTodosLosItems(Pareja(2))
            
            ' @ Lo regresamos
            Call WarpUserChar(Pareja(2), UserList(Pareja(2)).flags.RetosUser.PosAnterior.map, UserList(Pareja(2)).flags.RetosUser.PosAnterior.X(1), UserList(Pareja(2)).flags.RetosUser.PosAnterior.Y(1), False)
            
            ' @ Reseteamos los flags de reto del personaje
            Call ResetUserRetos(Pareja(2))
        End If

        ' @ Reseteamos los flags del perdedor principal.
        Call ResetUserRetos(Perdedor)
    End With
    
    ' @ Not items
    If Items = 0 Then
        ' @ Reseteamos la cancha
        Call ResetCanchaReto(UserList(Ganador).flags.RetosUser.ArenaSlot)
            
        ' @ Reseteamos la info principal del ganador si no era por items
        ResetUserRetos Ganador
    End If
        
End Sub
Public Sub RestaurarStats(ByVal UserIndex As Integer)

    Dim Pareja(1 To 2) As Integer
    
    ' @ Regresamos a su estado anterior (estadisticas y flags)
    
    With UserList(UserIndex)

        Call ResetearStatsReto(UserIndex)

        ' ¿Existe Team?
        Pareja(1) = .flags.RetosUser.Parejas(1)
        Pareja(2) = .flags.RetosUser.Parejas(2)
        
        ' Team 1
        If Pareja(1) <> 0 Then
            Call ResetearStatsReto(Pareja(1))
        End If
        
        ' Team 2
        If Pareja(2) <> 0 Then
            Call ResetearStatsReto(Pareja(2))
        End If
    End With
End Sub

Public Function ChequeoMuertes(ByVal UserIndex As Integer, ByVal Modalidad As eModalidad) As Boolean

    ' @ Chequeo si los personajes están muertos
    ' @ Si todos los personajes están muertos significa que el round terminó.
    
    Retos_ChequeoMuertes = False
    
    With UserList(UserIndex)
        Select Case Modalidad
        
            Case eModalidad.DOSvsDOS
                If .flags.Muerto Then
                    If UserList(.flags.RetosUser.Parejas(1)).flags.Muerto Then
                        Retos_ChequeoMuertes = True
                    End If
                End If
                
            Case eModalidad.TRESvsTRES
                If .flags.Muerto Then
                    If UserList(.flags.RetosUser.Parejas(1)).flags.Muerto And _
                        UserList(.flags.RetosUser.Parejas(2)).flags.Muerto Then
                        Retos_ChequeoMuertes = True
                    End If
                End If
        End Select
    End With
End Function
Public Sub SumarRoundGanado(ByVal ArenaIndex As Integer, ByVal TeamIndex As Integer)
    ' @ Agregamos un round ganado a los personajes
    
    With Retos(ArenaIndex)
        .Rounds(TeamIndex) = .Rounds(TeamIndex) + 1
    End With
End Sub
Public Sub EmpezarCombate(ByVal UserIndex As Integer, ByVal UserIndex2 As Integer, ByVal SlotArena As Byte)
    ' @ Mandamos a los personajes a luchar
    ' @Enviamos a los usuarios a luchar
    
    Dim Pareja(1 To 2) As Integer
    
    With UserList(UserIndex)
        ' Warp Users
        Call WarpUserChar(UserIndex, Arenas(SlotArena).map, Arenas(SlotArena).X(1), Arenas(SlotArena).Y(1), False)
        
        ' Cuenta regresiva
        Call mRetos.EnviarCuentaRegresiva(UserIndex)
        
        ' Posibles parejas
        Pareja(1) = .flags.RetosUser.Parejas(1)
        Pareja(2) = .flags.RetosUser.Parejas(1)
        
        If Pareja(1) <> 0 Then
            Call WarpUserChar(Pareja(1), Arenas(SlotArena).map, Arenas(SlotArena).X(1) + 1, Arenas(SlotArena).Y(1), False)
            Call mRetos.EnviarCuentaRegresiva(Pareja(1))
        End If
        
        If Pareja(2) <> 0 Then
            Call WarpUserChar(Pareja(2), Arenas(SlotArena).map, Arenas(SlotArena).X(1), Arenas(SlotArena).Y(1) + 1, False)
            Call mRetos.EnviarCuentaRegresiva(Pareja(2))
        End If
    End With
    
    With UserList(UserIndex2)
        ' Warp Users
        Call WarpUserChar(UserIndex2, Arenas(SlotArena).map, Arenas(SlotArena).X(2), Arenas(SlotArena).Y(2), False)
        
        ' Cuenta regresiva
        Call mRetos.EnviarCuentaRegresiva(UserIndex2)
        
        ' Posibles parejas
        Pareja(1) = .flags.RetosUser.Parejas(1)
        Pareja(2) = .flags.RetosUser.Parejas(1)
        
        If Pareja(1) <> 0 Then
            Call WarpUserChar(Pareja(1), Arenas(SlotArena).map, Arenas(SlotArena).X(2), Arenas(SlotArena).Y(2) - 1, False)
            Call mRetos.EnviarCuentaRegresiva(Pareja(1))
        End If
        
        If Pareja(2) <> 0 Then
            Call WarpUserChar(Pareja(2), Arenas(SlotArena).map, Arenas(SlotArena).X(2) - 1, Arenas(SlotArena).Y(2), False)
            Call mRetos.EnviarCuentaRegresiva(Pareja(2))
        End If
    End With
End Sub
Public Sub CombateRetos(ByVal Ganador As Integer, ByVal Perdedor As Integer)

    ' @ Manejamos los rounds ganados
    
    Dim SlotArena As Byte
    Dim Msj As String
    Dim Pareja(1 To 2) As Integer
    Dim RoundsGanados As Byte
    
    With UserList(Ganador)
        If .flags.EnEvento = 0 Then Exit Sub
        
        SlotArena = .flags.RetosUser.ArenaSlot

        ' Sumamos un round ganado
        Select Case .flags.EnEvento
            Case eModalidad.UNOvsUNO
                Call mRetos.SumarRoundGanado(SlotArena, .flags.RetosUser.TeamIndex)
            Case eModalidad.DOSvsDOS, eModalidad.TRESvsTRES
                If mRetos.ChequeoMuertes(Perdedor, .flags.EnEvento) Then
                    Call mRetos.SumarRoundGanado(SlotArena, .flags.RetosUser.TeamIndex)
                End If
        End Select
        
        RoundsGanados = Retos(SlotArena).Rounds(.flags.RetosUser.TeamIndex)
        
        ' Primer round ganado
        If RoundsGanados = 1 Then
            ' Revivimos a los perdedores o al perdedor
            Call RevivirUsuariosReto(Perdedor)
            
            Call EmpezarCombate(Ganador, Perdedor, SlotArena)
            
            Call mRetos.RestaurarStats(Ganador)
        Else
            Select Case .flags.EnEvento
                Case eModalidad.UNOvsUNO
                    ' Mensaje
                    Msj = "Retos 1vs1» " & UserList(Retos(SlotArena).Targets(1)).name & " vs " & UserList(Retos(SlotArena).Targets(4)).name & " .Ganador " & .name & "."
                
                Case eModalidad.DOSvsDOS
                    ' Mensaje
                    Msj = "Retos 2vs2» Ha finalizado el reto de " & UserList(Retos(SlotArena).Targets(1)).name & "-" & UserList(Retos(SlotArena).Targets(2)).name & " vs " _
                    & UserList(Retos(SlotArena).Targets(4)).name & "-" & UserList(Retos(SlotArena).Targets(5)).name & " .Ganadores " & .name & "-" & UserList(.flags.RetosUser.Parejas(1)).name & "."

                Case eModalidad.TRESvsTRES
                    Msj = "Retos 2vs2» Ha finalizado el reto de " & UserList(Retos(SlotArena).Targets(1)).name & "-" & UserList(Retos(SlotArena).Targets(2)).name & "-" & UserList(Retos(SlotArena).Targets(3)).name & " vs " _
                        & UserList(Retos(SlotArena).Targets(4)).name & "-" & UserList(Retos(SlotArena).Targets(5)).name & "-" & UserList(Retos(SlotArena).Targets(6)).name & " .Ganadores " & .name & "-" & _
                        UserList(.flags.RetosUser.Parejas(1)).name & "-" & UserList(.flags.RetosUser.Parejas(2)).name & "."
            End Select

            ' Enviamos el mensaje
            Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg(Msj, FontTypeNames.FONTTYPE_GUILD))
            
            ' Entregamos los premios
            Call mRetos.PremiosReto(Ganador, Perdedor, Retos(SlotArena).Oro, Retos(SlotArena).Items)
            
            ' Stats del ganador nuevos
            Call mRetos.RestaurarStats(Ganador)
            
            ' Revivimos al perdedor
            Call RevivirUsuariosReto(Perdedor)
        End If
        
    End With
End Sub

Public Sub RevivirUsuariosReto(ByVal UserIndex As Integer)
    
    ' @ Revivimos a los personajes
    
    With UserList(UserIndex)
        Call RevivirUsuario(UserIndex)
        
        If .flags.RetosUser.Parejas(1) <> 0 Then
            Call RevivirUsuario(.flags.RetosUser.Parejas(1))
        End If
        
        If .flags.RetosUser.Parejas(2) <> 0 Then
            Call RevivirUsuario(.flags.RetosUser.Parejas(2))
        End If
    End With
End Sub

****SERVIDOR FUNCIONAL Y COMPLETO****

Pasamos con el cliente.
Buscar
Código:
Private Enum ClientPacketID
antes del end enum

Código:
   Packet_Retos

En el modúlo protocol.

Código:
Public Sub WritePacketRetos(ByVal TIPO As Byte, Optional ByVal Target As String, Optional ByVal Oro As Long, Optional ByVal Items As Byte = 0, _
    Optional ByVal ParejaMia As String = vbNullString, _
    Optional ByVal ParejaTarget As String = vbNullString, _
    Optional ByVal ParejaTarget2 As String = vbNullString, _
    Optional ByVal ParejaMia2 As String = vbNullString)
    
    With outgoingData
        Call .WriteByte(ClientPacketID.Packet_Retos)
        
        Call .WriteByte(TIPO)
        
        Select Case TIPO
            Case eRetos.unoVSuno
                Call .WriteLong(Oro)
                Call .WriteByte(Items)
                Call .WriteASCIIString(Target)
            Case eRetos.dosVSdos
                Call .WriteLong(Oro)
                Call .WriteByte(Items)
                Call .WriteASCIIString(Target)
                Call .WriteASCIIString(ParejaMia)
                Call .WriteASCIIString(ParejaTarget)
                
            Case eRetos.tresVStres
                Call .WriteLong(Oro)
                Call .WriteByte(Items)
                Call .WriteASCIIString(Target)
                Call .WriteASCIIString(ParejaMia)
                Call .WriteASCIIString(ParejaTarget)
                Call .WriteASCIIString(ParejaTarget2)
                Call .WriteASCIIString(ParejaMia2)
            Case eRetos.Aceptar
                Call .WriteASCIIString(Target)
            Case eRetos.Abandonar
                Call .WriteByte(TIPO)
            
        End Select
    End With
End Sub


buscar

Código:
           Case "/MEDITAR"
                If UserMinMAN = UserMaxMAN Then Exit Sub
                
                If UserEstado = 1 Then 'Muerto
                    With FontTypes(FontTypeNames.FONTTYPE_INFO)
                        Call ShowConsoleMsg("¡¡Estás muerto!!", .red, .green, .blue, .bold, .italic)
                    End With
                    Exit Sub
                End If
                Call WriteMeditate

Código:
           Case "/ACEPTAR"
                If notNullArguments Then
                    Call WritePacketRetos(eRetos.Aceptar, ArgumentosRaw)
                Else
                    'Avisar que falta el parametro
                    Call ShowConsoleMsg("Faltan parámetros. Utilice /ACEPTAR NICKNAME.")
                End If
                
            Case "/ACASA"
                Call WritePacketRetos(eRetos.Abandonar)

En el modúlo declaraciones en cualquier parte pongan.
Código:
Public CuentaRegresiva As Byte
Public Enum eRetos
    unoVSuno = 1
    dosVSdos = 2
    tresVStres = 3
    Aceptar = 4
    Abandonar = 5
End Enum




Está funcional. Lo único que se les encargo son los formularios
Aclaración: Está extraído de Northland AO, el desarrollador de el código es Shak, les dejo los créditos a el.
avatar
Metrosersuah
Nivel 5
Nivel 5

¿BANEADO? : No.
Premios : Ninguno.
Cantidad de envíos : 237
Localización : 4 Paredes
Fecha de inscripción : 13/02/2016

Ver perfil de usuario http://www.argentumonline.com.ar

Volver arriba Ir abajo

Re: Sistema de retos 1vs1,2vs2. Funcionales y completos.

Mensaje por Toyz el 6/1/2017, 5:48 pm

Variables innecesarias, cuenta regresiva para recoger los items supongo en todos los usuarios, eso debería ser sólo para los que entran al reto.

Las variables que van en el personaje son bastantes, las sacaría del userflags y haría un type nuevo.

Lo demás lo leí muy por arriba así que mejor no opino.

Gracias por traer un nuevo aporte, aunque esté en varios lados nunca es malo tener una diferente manera de programar.


_______________

Como saben yo aporto bastante en Servers-Argentum y les quiero decir que todos tienen derecho de usar y de aportar en otra comunidad mis aportes pero sólo con un requisito y es tan simple que dejar los créditos. Gracias.
Si conocen otra comunidad y en esa misma mis aportes no están aportados, si tenés tiempo y ganas, aportalo! A mucha gente le puede servir. No te olvides del requisito Razz

MIS MEJORES APORTES:

Compra/venta de personajes:
https://goo.gl/A44Av0

Juegos del Hambre:
https://goo.gl/u6aNUG

Deathmatch automático:
https://goo.gl/GQF4fK

Sistema de retos vía MMR con búsqueda, emparejamiento, etc:
https://goo.gl/40uP0f

Sistemas de eventos automáticos de 1vs1 hasta 10vs10:
https://goo.gl/XYKygc

1VS1 - AIM - MELEE - Gana Sigue (Se liberan cupos)
https://goo.gl/qq83wx

Retos 3vs3 - [Items, 2 rounds, múltiples arenas, oro]
https://goo.gl/x8SMnV

Eliminar sistema de Skill (COMPLETO)
https://goo.gl/mKxHzC
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

Re: Sistema de retos 1vs1,2vs2. Funcionales y completos.

Mensaje por Metrosersuah el 6/1/2017, 11:32 pm

Para que no envien a todos la cuenta regresiva sólo tenes que modificar el senddata Razz.
¿Cuales es la diferencia de sacarlas de userflags y crear un type nuevo? qué cambia?
avatar
Metrosersuah
Nivel 5
Nivel 5

¿BANEADO? : No.
Premios : Ninguno.
Cantidad de envíos : 237
Localización : 4 Paredes
Fecha de inscripción : 13/02/2016

Ver perfil de usuario http://www.argentumonline.com.ar

Volver arriba Ir abajo

Re: Sistema de retos 1vs1,2vs2. Funcionales y completos.

Mensaje por Toyz el 6/1/2017, 11:54 pm

"Para que no envien a todos la cuenta regresiva sólo tenes que modificar el senddata Razz."

¿?¿?

-
Queda el código más ordenado.


_______________

Como saben yo aporto bastante en Servers-Argentum y les quiero decir que todos tienen derecho de usar y de aportar en otra comunidad mis aportes pero sólo con un requisito y es tan simple que dejar los créditos. Gracias.
Si conocen otra comunidad y en esa misma mis aportes no están aportados, si tenés tiempo y ganas, aportalo! A mucha gente le puede servir. No te olvides del requisito Razz

MIS MEJORES APORTES:

Compra/venta de personajes:
https://goo.gl/A44Av0

Juegos del Hambre:
https://goo.gl/u6aNUG

Deathmatch automático:
https://goo.gl/GQF4fK

Sistema de retos vía MMR con búsqueda, emparejamiento, etc:
https://goo.gl/40uP0f

Sistemas de eventos automáticos de 1vs1 hasta 10vs10:
https://goo.gl/XYKygc

1VS1 - AIM - MELEE - Gana Sigue (Se liberan cupos)
https://goo.gl/qq83wx

Retos 3vs3 - [Items, 2 rounds, múltiples arenas, oro]
https://goo.gl/x8SMnV

Eliminar sistema de Skill (COMPLETO)
https://goo.gl/mKxHzC
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

Re: Sistema de retos 1vs1,2vs2. Funcionales y completos.

Mensaje por Metrosersuah el 7/1/2017, 12:40 am

Me exprese mal ahora lo edito y pongo la cuenta para los usuarios que están retando.
avatar
Metrosersuah
Nivel 5
Nivel 5

¿BANEADO? : No.
Premios : Ninguno.
Cantidad de envíos : 237
Localización : 4 Paredes
Fecha de inscripción : 13/02/2016

Ver perfil de usuario http://www.argentumonline.com.ar

Volver arriba Ir abajo

Re: Sistema de retos 1vs1,2vs2. Funcionales y completos.

Mensaje por Toyz el 7/1/2017, 12:51 am

No es tan simple, tenés que hacer varios cambios de variables y sacar eso del pasar segundo.


_______________

Como saben yo aporto bastante en Servers-Argentum y les quiero decir que todos tienen derecho de usar y de aportar en otra comunidad mis aportes pero sólo con un requisito y es tan simple que dejar los créditos. Gracias.
Si conocen otra comunidad y en esa misma mis aportes no están aportados, si tenés tiempo y ganas, aportalo! A mucha gente le puede servir. No te olvides del requisito Razz

MIS MEJORES APORTES:

Compra/venta de personajes:
https://goo.gl/A44Av0

Juegos del Hambre:
https://goo.gl/u6aNUG

Deathmatch automático:
https://goo.gl/GQF4fK

Sistema de retos vía MMR con búsqueda, emparejamiento, etc:
https://goo.gl/40uP0f

Sistemas de eventos automáticos de 1vs1 hasta 10vs10:
https://goo.gl/XYKygc

1VS1 - AIM - MELEE - Gana Sigue (Se liberan cupos)
https://goo.gl/qq83wx

Retos 3vs3 - [Items, 2 rounds, múltiples arenas, oro]
https://goo.gl/x8SMnV

Eliminar sistema de Skill (COMPLETO)
https://goo.gl/mKxHzC
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

Se deslogea

Mensaje por Hykarius AOS el 7/1/2017, 2:28 pm

Buenas , al querer retar ( Por que lo probe) Me saca Clikeo RETAR y se me va al Conectar.

Hykarius AOS
Nivel 1
Nivel 1

¿BANEADO? : No.
Premios : Ninguno.
Cantidad de envíos : 4
Localización : Maza 1521
Fecha de inscripción : 03/09/2016

Ver perfil de usuario

Volver arriba Ir abajo

Re: Sistema de retos 1vs1,2vs2. Funcionales y completos.

Mensaje por Toyz el 7/1/2017, 4:17 pm

Pusiste mal los paquetes o hacés mal llamadas o en caso de que sea el código que ande mal revisá el write.


_______________

Como saben yo aporto bastante en Servers-Argentum y les quiero decir que todos tienen derecho de usar y de aportar en otra comunidad mis aportes pero sólo con un requisito y es tan simple que dejar los créditos. Gracias.
Si conocen otra comunidad y en esa misma mis aportes no están aportados, si tenés tiempo y ganas, aportalo! A mucha gente le puede servir. No te olvides del requisito Razz

MIS MEJORES APORTES:

Compra/venta de personajes:
https://goo.gl/A44Av0

Juegos del Hambre:
https://goo.gl/u6aNUG

Deathmatch automático:
https://goo.gl/GQF4fK

Sistema de retos vía MMR con búsqueda, emparejamiento, etc:
https://goo.gl/40uP0f

Sistemas de eventos automáticos de 1vs1 hasta 10vs10:
https://goo.gl/XYKygc

1VS1 - AIM - MELEE - Gana Sigue (Se liberan cupos)
https://goo.gl/qq83wx

Retos 3vs3 - [Items, 2 rounds, múltiples arenas, oro]
https://goo.gl/x8SMnV

Eliminar sistema de Skill (COMPLETO)
https://goo.gl/mKxHzC
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

Re: Sistema de retos 1vs1,2vs2. Funcionales y completos.

Mensaje por Metrosersuah el 8/1/2017, 11:17 pm

@Hykarius AOS escribió:Buenas , al querer retar ( Por que lo probe) Me saca Clikeo RETAR y se me va al Conectar.


No es muy difícil copiar y pegar..
El sistema esta testeado y funcional, es más ahora lo tengo funcionando en NirvanaAO.
EDIT: Toyz, ya lo hice lo tengo funcionando correctamente, luego publicaré una actualización
avatar
Metrosersuah
Nivel 5
Nivel 5

¿BANEADO? : No.
Premios : Ninguno.
Cantidad de envíos : 237
Localización : 4 Paredes
Fecha de inscripción : 13/02/2016

Ver perfil de usuario http://www.argentumonline.com.ar

Volver arriba Ir abajo

Re: Sistema de retos 1vs1,2vs2. Funcionales y completos.

Mensaje por ferat el 31/1/2017, 3:15 pm

error de compilacion
se ha detectado un nombre ambiguo: en evento

Flags
Public Type UserFlags
EnEvento As eEstadoEvento
EnEvento As eEstadoEvento

me paso en el servidor

ferat
Nivel 3
Nivel 3

¿BANEADO? : No.
Premios : Ninguno.
Cantidad de envíos : 86
Localización : PC
Fecha de inscripción : 14/12/2015

Ver perfil de usuario

Volver arriba Ir abajo

Re: Sistema de retos 1vs1,2vs2. Funcionales y completos.

Mensaje por Toyz el 1/2/2017, 8:05 pm

Borrá una de las variables.


_______________

Como saben yo aporto bastante en Servers-Argentum y les quiero decir que todos tienen derecho de usar y de aportar en otra comunidad mis aportes pero sólo con un requisito y es tan simple que dejar los créditos. Gracias.
Si conocen otra comunidad y en esa misma mis aportes no están aportados, si tenés tiempo y ganas, aportalo! A mucha gente le puede servir. No te olvides del requisito Razz

MIS MEJORES APORTES:

Compra/venta de personajes:
https://goo.gl/A44Av0

Juegos del Hambre:
https://goo.gl/u6aNUG

Deathmatch automático:
https://goo.gl/GQF4fK

Sistema de retos vía MMR con búsqueda, emparejamiento, etc:
https://goo.gl/40uP0f

Sistemas de eventos automáticos de 1vs1 hasta 10vs10:
https://goo.gl/XYKygc

1VS1 - AIM - MELEE - Gana Sigue (Se liberan cupos)
https://goo.gl/qq83wx

Retos 3vs3 - [Items, 2 rounds, múltiples arenas, oro]
https://goo.gl/x8SMnV

Eliminar sistema de Skill (COMPLETO)
https://goo.gl/mKxHzC
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

Re: Sistema de retos 1vs1,2vs2. Funcionales y completos.

Mensaje por Enjor el 11/4/2017, 10:00 pm

Tengo el mismo codigo, lo sacaste de Northland AO?
Solucionaste el problema al terminar el reto o /salir (perdes)
Lugo ingreses el usuario y pass, para ingresar a jugar, no puedas volver a ingresar... Pero sigue ahi conectado, solo se arreglar cerrando servidor.

Enjor
Nivel 1
Nivel 1

¿BANEADO? : No.
Premios : Ninguno.
Cantidad de envíos : 3
Localización : canada
Fecha de inscripción : 22/01/2017

Ver perfil de usuario

Volver arriba Ir abajo

Re: Sistema de retos 1vs1,2vs2. Funcionales y completos.

Mensaje por ferat el 14/11/2017, 10:20 pm


ferat
Nivel 3
Nivel 3

¿BANEADO? : No.
Premios : Ninguno.
Cantidad de envíos : 86
Localización : PC
Fecha de inscripción : 14/12/2015

Ver perfil de usuario

Volver arriba Ir abajo

Re: Sistema de retos 1vs1,2vs2. Funcionales y completos.

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Volver arriba

- Temas similares

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