Advertisement
Luciano_fuentes

Clasificatorias TDN.

Oct 29th, 2016
335
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Option Explicit
  2.  
  3. '@@ Autor: G Toyz
  4. '@@ Fecha: 04/10
  5. '@@ Creación: 22:23
  6. '@@ Modificación: 28/10 - 10:21 PM _
  7.     Agrego para que se puedan buscar otros tipos de retos.
  8.  
  9. Private Const Gold                        As Long = 100000 '@@ Cantidad de oro que sale cada reto.
  10. Private Const Max_Search                  As Byte = 30 '@@ Máximo de equipos buscando.
  11. Private Const refError                    As String = "No cumples los requisitos"
  12. Private Const Count_Retos                 As Byte = 3  '@@ Cantidad de retos que haya _
  13.                                                         en el servidor, 1vs1, 2vs2, 3vs3 = 3
  14. Private Type Team_Searching
  15.     Users()                               As Integer  '@@ Usuarios en el equipo.
  16.    Time_Searching                        As Integer  '@@ Tiempo que llevan buscando.
  17.    MMR_Rank                              As Integer  '@@ Rango de MMR para emparejar.
  18.    MMR                                   As Integer  '@@ MMR del equipo (promedio).
  19.    Accepting                             As Boolean  '@@ ¿Están aceptando un emparejamiento?
  20.    Accepts                               As Byte     '@@ ¿Cuántos aceptaron ese emparejamiento?
  21.    Team_ID_Accept                        As Byte     '@@ ¿Contra quién los emparejó?
  22. End Type
  23.  
  24. Private Type Searching
  25.     Searching(1 To Max_Search)            As Team_Searching '@@ Equipos buscando.
  26.    Teams_Searching                       As Byte           '@@ Cantidad de equipos buscando.
  27. End Type
  28.  
  29. Private Retos_Searching(1 To Count_Retos) As Searching '@@ ¿Qué tipo de retos quiere buscar?
  30. '_
  31.  
  32. Public Sub Load()
  33.    
  34.     '@@ Redimensiono los arrays de Usuarios.
  35.    
  36.     Dim LoopC As Long
  37.     Dim loopX As Long
  38.    
  39.     For LoopC = 1 To Count_Retos
  40.         For loopX = 1 To Max_Search
  41.             ReDim Retos_Searching(LoopC).Searching(loopX).Users(1 To LoopC)
  42.         Next loopX
  43.     Next LoopC
  44.    
  45. End Sub
  46.  
  47. Public Sub Send_Search(ByRef ID() As Integer, ByVal n_Reto As Byte)
  48.  
  49.     If Can_Search(ID(), True) = False Then Exit Sub
  50.    
  51.     Dim LoopC As Long
  52.     Dim loopX As Long
  53.     Dim Names As String
  54.    
  55.     UserList(ID(1)).Search_Retos.send = True
  56.     UserList(ID(1)).Search_Retos.Type_Reto = n_Reto
  57.     UserList(ID(1)).Search_Retos.Amount_Accept = 1
  58.     UserList(ID(1)).Search_Retos.accept = True
  59.     ReDim UserList(ID(1)).Search_Retos.Send_IDS(1 To n_Reto)
  60.    
  61.     For LoopC = 1 To n_Reto
  62.         UserList(ID(1)).Search_Retos.Send_IDS(LoopC) = ID(LoopC)
  63.         If Names = "" Then
  64.             Names = UserList(ID(LoopC)).name
  65.         Else
  66.             Names = Names & ", " & UserList(ID(LoopC)).name
  67.         End If
  68.     Next LoopC
  69.    
  70.     If n_Reto = 1 Then
  71.         Call Search(ID(), n_Reto)
  72.         Exit Sub
  73.     End If
  74.    
  75.     For loopX = 1 To n_Reto
  76.         Call WriteConsoleMsg(ID(loopX), "El usuario " & UserList(ID(1)).name & " los ha invitado a participar en las clasificatorias del reto " & n_Reto & " vs " & n_Reto & " con los usuarios [" & Names & "]. Ponga /ACEPTAR " & UserList(ID(1)).name & " para aceptar la invitación.", FontTypeNames.FONTTYPE_INFOBOLD)
  77.     Next loopX
  78.  
  79. End Sub
  80.  
  81. Public Sub Accept_Search(ByVal ID As Integer, ByVal ID_Send As Integer)
  82.    
  83.     Dim LoopC As Long
  84.     Dim NoYes As Boolean
  85.    
  86.     If ID_Send = 0 Then Exit Sub
  87.    
  88.     NoYes = False
  89.     For LoopC = 1 To UserList(ID_Send).Search_Retos.Type_Reto
  90.         If UserList(ID_Send).Search_Retos.Send_IDS(LoopC) = ID Then _
  91.             NoYes = True
  92.     Next LoopC
  93.    
  94.     If NoYes = False Then _
  95.         Call WriteConsoleMsg(ID, "El usuario " & UserList(ID_Send).name & " no te ha invitado a ninguna clasificatoria.", FontTypeNames.FONTTYPE_INFOBOLD)
  96.    
  97.     If UserList(ID).Search_Retos.accept = True Then _
  98.         Call WriteConsoleMsg(ID, "Ya has aceptado una invitación.", FontTypeNames.FONTTYPE_INFOBOLD)
  99.    
  100.     UserList(ID).Search_Retos.accept = True
  101.     UserList(ID_Send).Search_Retos.Amount_Accept = UserList(ID_Send).Search_Retos.Amount_Accept + 1
  102.    
  103.     If UserList(ID_Send).Search_Retos.Amount_Accept = UserList(ID_Send).Search_Retos.Type_Reto Then _
  104.         Call Search(UserList(ID_Send).Search_Retos.Send_IDS(), UserList(ID_Send).Search_Retos.Type_Reto)
  105.  
  106. End Sub
  107.  
  108. Public Sub Send_Matching(ByVal Team1 As Byte, ByVal Team2 As Byte, ByVal n_Reto As Byte)
  109.  
  110.     '@@ Hacer un paquete (Write_Send_Matching) que obligue aceptar el reto al usuario.
  111.    
  112.     Dim LoopC As Long
  113.  
  114.     With Retos_Searching(n_Reto)
  115.         For LoopC = 1 To n_Reto
  116.             Call WriteSend_Accept_Matching(.Searching(Team1).Users(LoopC))
  117.             Call WriteSend_Accept_Matching(.Searching(Team2).Users(LoopC))
  118.         Next LoopC
  119.         .Searching(Team1).Accepting = True
  120.         .Searching(Team2).Accepting = True
  121.         .Searching(Team1).Accepts = 0
  122.         .Searching(Team2).Accepts = 0
  123.     End With
  124.  
  125. End Sub
  126.  
  127. Public Sub Accept_Matching(ByVal ID As Integer)
  128.    
  129.     If UserList(ID).Search_Retos.Type_Reto = 0 Then Exit Sub
  130.    
  131.     With Retos_Searching(UserList(ID).Search_Retos.Type_Reto)
  132.         If .Searching(UserList(ID).Search_Retos.Team).Accepting = True Then
  133.             .Searching(UserList(ID).Search_Retos.Team).Accepts = .Searching(UserList(ID).Search_Retos.Team).Accepts + 1
  134.             If .Searching(UserList(ID).Search_Retos.Team).Accepts = UserList(ID).Search_Retos.Type_Reto And .Searching(.Searching(UserList(ID).Search_Retos.Team).Team_ID_Accept).Accepts = UserList(ID).Search_Retos.Type_Reto Then
  135.                 Call Test_Retos(UserList(ID).Search_Retos.Team, .Searching(UserList(ID).Search_Retos.Team).Team_ID_Accept, UserList(ID).Search_Retos.Type_Reto)
  136.             End If
  137.         End If
  138.     End With
  139.    
  140. End Sub
  141.  
  142. Private Sub Test_Retos(ByVal Team1 As Byte, ByVal Team2 As Byte, ByVal n_Retos As Byte)
  143.    
  144.     Dim LoopC As Long
  145.     Dim loopX As Long
  146.    
  147.     With Retos_Searching(n_Retos)
  148.         For LoopC = 1 To n_Retos
  149.             Call WarpUserChar(.Searching(Team1).Users(LoopC), 1, 60, 50 + LoopC, False)
  150.             Call WarpUserChar(.Searching(Team2).Users(LoopC), 1, 60, 55 + LoopC, False)
  151.         Next LoopC
  152.     End With
  153.    
  154. End Sub
  155.  
  156. Public Sub Refuse_Matching(ByVal ID As Integer)
  157.  
  158.     If UserList(ID).Search_Retos.Type_Reto = 0 Then Exit Sub
  159.    
  160.     With Retos_Searching(UserList(ID).Search_Retos.Type_Reto)
  161.         If .Searching(UserList(ID).Search_Retos.Team).Accepting = True Then
  162.             .Searching(.Searching(UserList(ID).Search_Retos.Team).Team_ID_Accept).Accepting = False
  163.             .Searching(.Searching(UserList(ID).Search_Retos.Team).Team_ID_Accept).Accepts = 0
  164.             .Searching(.Searching(UserList(ID).Search_Retos.Team).Team_ID_Accept).Team_ID_Accept = 0
  165.             .Searching(.Searching(UserList(ID).Search_Retos.Team).Team_ID_Accept).Time_Searching = 0
  166.             .Searching(.Searching(UserList(ID).Search_Retos.Team).Team_ID_Accept).MMR_Rank = 100 'Inicial.
  167.            Call Matching(.Searching(ID).Team_ID_Accept, UserList(ID).Search_Retos.Type_Reto)
  168.             Call Cancel_Search(ID)
  169.         End If
  170.     End With
  171.    
  172. End Sub
  173.  
  174. Private Sub Search(ByRef ID() As Integer, ByVal n_Reto As Byte)
  175.  
  176.     '@@ Lo ponemos en búsqueda de reto.
  177.  
  178.   '  If Can_Search(ID()) = False Then Exit Sub
  179.    
  180.     Dim LoopC As Long
  181.    
  182.     With Retos_Searching(n_Reto)
  183.         .Teams_Searching = .Teams_Searching + 1
  184.         For LoopC = 1 To n_Reto
  185.             .Searching(.Teams_Searching).Users(LoopC) = ID(LoopC)
  186.             UserList(ID(LoopC)).Search_Retos.Type_Reto = n_Reto
  187.             UserList(ID(LoopC)).Search_Retos.Team = .Teams_Searching
  188.             WriteConsoleMsg (ID(LoopC)), "Buscando reto...", FontTypeNames.FONTTYPE_INFOBOLD
  189.         Next LoopC
  190.         .Searching(.Teams_Searching).MMR_Rank = 100
  191.         .Searching(.Teams_Searching).Time_Searching = 0
  192.         .Searching(.Teams_Searching).MMR = MMR_Amount(ID())
  193.         Call Matching(.Teams_Searching, n_Reto)
  194.     End With
  195.  
  196. End Sub
  197.  
  198. Private Sub Matching(ByVal ID_Team As Byte, ByVal n_Reto As Byte)
  199.  
  200.     '@@ Tratamos de emparejar.
  201.  
  202.     Dim Team_LoopC As Long
  203.  
  204.     With Retos_Searching(n_Reto)
  205.         For Team_LoopC = 1 To Max_Search
  206.             If Compare_MMR(ID_Team, Team_LoopC, n_Reto) = True Then
  207.                 If ID_Team = Team_LoopC Then Exit Sub
  208.                 If .Searching(Team_LoopC).Accepting = True Then Exit Sub
  209.                 .Searching(ID_Team).Team_ID_Accept = Team_LoopC
  210.                 .Searching(Team_LoopC).Team_ID_Accept = ID_Team
  211.                 Call Send_Matching(ID_Team, Team_LoopC, n_Reto)
  212.                 Exit For
  213.             End If
  214.         Next Team_LoopC
  215.     End With
  216.  
  217. End Sub
  218.  
  219. Private Function Compare_MMR(ByVal Team_1 As Byte, ByVal Team_2 As Byte, ByVal n_Reto As Byte) As Boolean
  220.  
  221.     '@@ Comparamos MMR.
  222.  
  223.     Compare_MMR = False
  224.    
  225.     With Retos_Searching(n_Reto)
  226.    
  227.         If .Searching(Team_1).MMR > .Searching(Team_2).MMR + .Searching(Team_1).MMR_Rank Then _
  228.             Exit Function
  229.        
  230.         If .Searching(Team_1).MMR < .Searching(Team_2).MMR - .Searching(Team_1).MMR_Rank Then _
  231.             Exit Function
  232.  
  233.     End With
  234.    
  235.     Compare_MMR = True
  236.  
  237. End Function
  238.  
  239. Private Function MMR_Amount(ByRef Players() As Integer) As Integer
  240.  
  241.     MMR_Amount = 0
  242.  
  243.     Dim LoopC As Long
  244.     Dim MMR As Integer
  245.    
  246.     For LoopC = 1 To UBound(Players())
  247.         MMR = MMR + UserList(Players(LoopC)).Search_Retos.MMR
  248.     Next LoopC
  249.        
  250.     MMR_Amount = (MMR / UBound(Players()))
  251.        
  252. End Function
  253.  
  254. Public Sub Cancel_Search(ByVal ID As Integer)
  255.  
  256.     '@@ Cancela la búsqueda de un usuario, también sirve para cuando se desconecta _
  257.         y para cuando entra a un reto.
  258.  
  259.     '@@ Llamadas: _
  260.         CloseSocket _
  261.         Nuevo paquete
  262.  
  263.     Dim LoopC As Long
  264.     Dim loopX As Long
  265.    
  266.     With Retos_Searching(UserList(ID).Search_Retos.Type_Reto)
  267.         .Searching(UserList(ID).Search_Retos.Team).MMR = 0
  268.         .Searching(UserList(ID).Search_Retos.Team).MMR_Rank = 0
  269.         For LoopC = 1 To UserList(ID).Search_Retos.Type_Reto
  270.             WriteConsoleMsg .Searching(UserList(ID).Search_Retos.Team).Users(LoopC), "¡Se canceló la búsqueda por: " & UserList(ID).name & ".", FontTypeNames.FONTTYPE_INFOBOLD
  271.             With UserList(.Searching(UserList(ID).Search_Retos.Team).Users(LoopC)).Search_Retos
  272.                 .MMR = 0
  273.                 .Team = 0
  274.                 .Type_Reto = 0
  275.                 If .send = True Then
  276.                     For loopX = 1 To UserList(ID).Search_Retos.Type_Reto
  277.                         .Send_IDS(loopX) = 0
  278.                     Next loopX
  279.                     .send = False
  280.                 End If
  281.             End With
  282.             .Searching(UserList(ID).Search_Retos.Team).Users(LoopC) = 0
  283.         Next LoopC
  284.         .Searching(UserList(ID).Search_Retos.Team).Time_Searching = 0
  285.         .Searching(UserList(ID).Search_Retos.Team).Accepting = False
  286.         .Searching(UserList(ID).Search_Retos.Team).Accepts = 0
  287.        
  288.     End With
  289.  
  290. End Sub
  291.  
  292. Private Function Can_Search(ByRef ID() As Integer, Optional ByVal Sender As Boolean) As Boolean
  293.  
  294.     Dim LoopC As Long
  295.  
  296.     Can_Search = False
  297.    
  298.     If UserList(ID(1)).Search_Retos.send = True Then
  299.         Call WriteConsoleMsg(ID(1), "Ya enviaste una solicitud para buscar un reto.", FontTypeNames.FONTTYPE_INFOBOLD)
  300.         Exit Function
  301.     End If
  302.    
  303.     For LoopC = 1 To UBound(ID())
  304.         With UserList(ID(LoopC))
  305.        
  306.             If .flags.Muerto Then
  307.                 Call WriteConsoleMsg(ID(1), "El usuario " & .name & " está muerto.", FontTypeNames.FONTTYPE_INFOBOLD)
  308.                 If Sender = False Then _
  309.                     Call WriteConsoleMsg(ID(LoopC), "¡Estás muerto!", FontTypeNames.FONTTYPE_INFOBOLD)
  310.                 Exit Function
  311.             End If
  312.            
  313.             If .Search_Retos.Team > 0 Then
  314.                 Call WriteConsoleMsg(ID(1), "El usuario " & .name & " ya está en reto.", FontTypeNames.FONTTYPE_INFOBOLD)
  315.                 If Sender = False Then _
  316.                     Call WriteConsoleMsg(ID(LoopC), "¡No puedes aceptar un reto estando en uno!", FontTypeNames.FONTTYPE_INFOBOLD)
  317.                 Exit Function
  318.             End If
  319.      
  320.         End With
  321.     Next LoopC
  322.    
  323.     Can_Search = True
  324.  
  325. End Function
  326.  
  327. Public Sub Count()
  328.  
  329.     '@@ El tiempo que lleva buscando un reto...
  330.    '@@ Llamadas: Timer de 1 segundo.
  331.    '@@ Aviso: Saqué el paquete que se enviaba cada un segundo que mandaba al cliente _
  332.                la cantidad de segundos que iba buscando, hacer en el cliente un timer _
  333.                de un segundo y si se manda la búsqueda (o sea, si inicia) empezar a contar.
  334.  
  335.     Dim LoopC As Long
  336.     Dim loopX As Long
  337.    
  338.     For LoopC = 1 To 3
  339.         With Retos_Searching(LoopC)
  340.             For loopX = 1 To Max_Search
  341.                 .Searching(loopX).Time_Searching = .Searching(loopX).Time_Searching + 1
  342.                 .Searching(loopX).MMR_Rank = .Searching(loopX).MMR_Rank + 1
  343.                 If .Searching(loopX).MMR_Rank = 200 Then Exit Sub
  344.             Next loopX
  345.         End With
  346.     Next LoopC
  347. End Sub
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement