Advertisement
Luciano_fuentes

TDN - MMR

Nov 1st, 2016
216
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.         Call Cancel_Search(.Searching(Team1).Users(1), True)
  153.         Call Cancel_Search(.Searching(Team2).Users(1), True)
  154.     End With
  155.    
  156. End Sub
  157.  
  158. Public Sub Refuse_Matching(ByVal ID As Integer)
  159.  
  160.     On Error GoTo Error_SearchRetos
  161.  
  162.     If UserList(ID).Search_Retos.Type_Reto = 0 Then Exit Sub
  163.    
  164.     Dim LoopC As Long
  165.    
  166.     With Retos_Searching(UserList(ID).Search_Retos.Type_Reto)
  167.         If .Searching(UserList(ID).Search_Retos.Team).Accepting = True Then
  168.             .Searching(.Searching(UserList(ID).Search_Retos.Team).Team_ID_Accept).Accepting = False
  169.             .Searching(.Searching(UserList(ID).Search_Retos.Team).Team_ID_Accept).Accepts = 0
  170.             .Searching(.Searching(UserList(ID).Search_Retos.Team).Team_ID_Accept).Team_ID_Accept = 0
  171.             .Searching(.Searching(UserList(ID).Search_Retos.Team).Team_ID_Accept).Time_Searching = 0
  172.             .Searching(.Searching(UserList(ID).Search_Retos.Team).Team_ID_Accept).MMR_Rank = 100 'Inicial.
  173.            For LoopC = 1 To UserList(ID).Search_Retos.Type_Reto
  174.                 WriteConsoleMsg .Searching(.Searching(UserList(ID).Search_Retos.Team).Team_ID_Accept).Users(LoopC), "¡El otro equipo rechazó el encuentro! Has vuelto a la cola.", FontTypeNames.FONTTYPE_INFOBOLD
  175.             Next LoopC
  176.             Call Matching(.Searching(UserList(ID).Search_Retos.Team).Team_ID_Accept, UserList(ID).Search_Retos.Type_Reto)
  177.             Call Cancel_Search(ID)
  178.         End If
  179.     End With
  180.    
  181.     Exit Sub
  182.    
  183. Error_SearchRetos:
  184.     Call LogError("Error en Refuse_Matching (Cola de retos). Número " & Err.Number & " Descripción: " & Err.description)
  185.    
  186. End Sub
  187.  
  188. Private Sub Search(ByRef ID() As Integer, ByVal n_Reto As Byte)
  189.  
  190.     '@@ Lo ponemos en búsqueda de reto.
  191.  
  192.   '  If Can_Search(ID()) = False Then Exit Sub
  193.    
  194.     Dim LoopC As Long
  195.    
  196.     With Retos_Searching(n_Reto)
  197.         .Teams_Searching = .Teams_Searching + 1
  198.         For LoopC = 1 To n_Reto
  199.             .Searching(.Teams_Searching).Users(LoopC) = ID(LoopC)
  200.             UserList(ID(LoopC)).Search_Retos.Type_Reto = n_Reto
  201.             UserList(ID(LoopC)).Search_Retos.Team = .Teams_Searching
  202.             WriteConsoleMsg (ID(LoopC)), "Buscando reto...", FontTypeNames.FONTTYPE_INFOBOLD
  203.         Next LoopC
  204.         .Searching(.Teams_Searching).MMR_Rank = 100
  205.         .Searching(.Teams_Searching).Time_Searching = 0
  206.         .Searching(.Teams_Searching).MMR = MMR_Amount(ID())
  207.         Call Matching(.Teams_Searching, n_Reto)
  208.     End With
  209.  
  210. End Sub
  211.  
  212. Private Sub Matching(ByVal ID_Team As Byte, ByVal n_Reto As Byte)
  213.  
  214.     '@@ Tratamos de emparejar.
  215.  
  216.     Dim Team_LoopC As Long
  217.  
  218.     With Retos_Searching(n_Reto)
  219.         For Team_LoopC = 1 To .Teams_Searching
  220.             If Compare_MMR(ID_Team, Team_LoopC, n_Reto) = True Then
  221.                 If ID_Team = Team_LoopC Then Exit Sub
  222.                 If .Searching(Team_LoopC).Accepting = True Then Exit Sub
  223.                 .Searching(ID_Team).Team_ID_Accept = Team_LoopC
  224.                 .Searching(Team_LoopC).Team_ID_Accept = ID_Team
  225.                 Call Send_Matching(ID_Team, Team_LoopC, n_Reto)
  226.                 Exit For
  227.             End If
  228.         Next Team_LoopC
  229.     End With
  230.  
  231. End Sub
  232.  
  233. Private Function Compare_MMR(ByVal Team_1 As Byte, ByVal Team_2 As Byte, ByVal n_Reto As Byte) As Boolean
  234.  
  235.     '@@ Comparamos MMR.
  236.  
  237.     Compare_MMR = False
  238.    
  239.     With Retos_Searching(n_Reto)
  240.    
  241.         If .Searching(Team_1).MMR > .Searching(Team_2).MMR + .Searching(Team_1).MMR_Rank Then _
  242.             Exit Function
  243.        
  244.         If .Searching(Team_1).MMR < .Searching(Team_2).MMR - .Searching(Team_1).MMR_Rank Then _
  245.             Exit Function
  246.  
  247.     End With
  248.    
  249.     Compare_MMR = True
  250.  
  251. End Function
  252.  
  253. Private Function MMR_Amount(ByRef Players() As Integer) As Integer
  254.  
  255.     MMR_Amount = 0
  256.  
  257.     Dim LoopC As Long
  258.     Dim MMR As Integer
  259.    
  260.     For LoopC = 1 To UBound(Players())
  261.         MMR = MMR + UserList(Players(LoopC)).Search_Retos.MMR
  262.     Next LoopC
  263.        
  264.     MMR_Amount = (MMR / UBound(Players()))
  265.        
  266. End Function
  267.  
  268. Public Sub Cancel_Search(ByVal ID As Integer, Optional ByVal No_Message As Boolean)
  269.  
  270.     '@@ Cancela la búsqueda de un usuario, también sirve para cuando se desconecta _
  271.         y para cuando entra a un reto.
  272.  
  273.     '@@ Llamadas: _
  274.         CloseSocket _
  275.         Nuevo paquete
  276.  
  277.     On Error GoTo Error_SearchRetos
  278.  
  279.     Dim LoopC As Long
  280.     Dim loopX As Long
  281.    
  282.     With Retos_Searching(UserList(ID).Search_Retos.Type_Reto)
  283.         .Searching(UserList(ID).Search_Retos.Team).MMR = 0
  284.         .Searching(UserList(ID).Search_Retos.Team).MMR_Rank = 0
  285.         .Searching(UserList(ID).Search_Retos.Team).Time_Searching = 0
  286.       '  If .Searching(UserList(ID).Search_Retos.Team).Accepting Then _
  287.              Call Matching(.Searching(UserList(ID).Search_Retos.Team).Team_ID_Accept, UserList(ID).Search_Retos.Type_Reto)
  288.        .Searching(UserList(ID).Search_Retos.Team).Accepting = False
  289.         .Searching(UserList(ID).Search_Retos.Team).Accepts = 0
  290.         .Searching(UserList(ID).Search_Retos.Team).Team_ID_Accept = 0
  291.         For LoopC = 1 To UserList(ID).Search_Retos.Type_Reto
  292.             If No_Message = False Then _
  293.                 WriteConsoleMsg .Searching(UserList(ID).Search_Retos.Team).Users(LoopC), "¡Se canceló la búsqueda por: " & UserList(ID).name & ".", FontTypeNames.FONTTYPE_INFOBOLD
  294.             With UserList(.Searching(UserList(ID).Search_Retos.Team).Users(LoopC)).Search_Retos
  295.                 Retos_Searching(UserList(ID).Search_Retos.Type_Reto).Searching(UserList(ID).Search_Retos.Team).Users(LoopC) = 0
  296.                 If .send = True Then
  297.                     For loopX = 1 To UserList(ID).Search_Retos.Type_Reto
  298.                         .Send_IDS(loopX) = 0
  299.                     Next loopX
  300.                     .send = False
  301.                 End If
  302.                 .Team = 0
  303.                 .Type_Reto = 0
  304.             End With
  305.         Next LoopC
  306.         .Teams_Searching = .Teams_Searching - 1
  307.     End With
  308.    
  309.     Exit Sub
  310.  
  311. Error_SearchRetos:
  312.     Call LogError("Error en Cancel_Search (Cola de retos). Número de error: " & Err.Number & " Descripción: " & Err.description)
  313.  
  314. End Sub
  315.  
  316. Private Function Can_Search(ByRef ID() As Integer, Optional ByVal Sender As Boolean) As Boolean
  317.  
  318.     Dim LoopC As Long
  319.  
  320.     Can_Search = False
  321.    
  322.     For LoopC = 1 To UBound(ID())
  323.         With UserList(ID(LoopC))
  324.        
  325.             If .flags.Muerto Then
  326.                 Call WriteConsoleMsg(ID(1), "El usuario " & .name & " está muerto.", FontTypeNames.FONTTYPE_INFOBOLD)
  327.                 If Sender = False Then _
  328.                     Call WriteConsoleMsg(ID(LoopC), "¡Estás muerto!", FontTypeNames.FONTTYPE_INFOBOLD)
  329.                 Exit Function
  330.             End If
  331.            
  332.             If .Search_Retos.Team > 0 Then
  333.                 Call WriteConsoleMsg(ID(1), "El usuario " & .name & " ya está en reto.", FontTypeNames.FONTTYPE_INFOBOLD)
  334.                 If Sender = False Then _
  335.                     Call WriteConsoleMsg(ID(LoopC), "¡No puedes aceptar un reto estando en uno!", FontTypeNames.FONTTYPE_INFOBOLD)
  336.                 Exit Function
  337.             End If
  338.      
  339.         End With
  340.     Next LoopC
  341.    
  342.     Can_Search = True
  343.  
  344. End Function
  345.  
  346. Public Sub Count()
  347.  
  348.     '@@ El tiempo que lleva buscando un reto...
  349.    '@@ Llamadas: Timer de 1 segundo.
  350.    '@@ Aviso: Saqué el paquete que se enviaba cada un segundo que mandaba al cliente _
  351.                la cantidad de segundos que iba buscando, hacer en el cliente un timer _
  352.                de un segundo y si se manda la búsqueda (o sea, si inicia) empezar a contar.
  353.  
  354.     Dim LoopC As Long
  355.     Dim loopX As Long
  356.    
  357.     For LoopC = 1 To 3
  358.         With Retos_Searching(LoopC)
  359.             For loopX = 1 To Max_Search
  360.                 .Searching(loopX).Time_Searching = .Searching(loopX).Time_Searching + 1
  361.                 .Searching(loopX).MMR_Rank = .Searching(loopX).MMR_Rank + 1
  362.                 If .Searching(loopX).MMR_Rank = 200 Then Exit Sub
  363.             Next loopX
  364.         End With
  365.     Next LoopC
  366. End Sub
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement