alditojeje

Torneo v1.0

Sep 21st, 2020 (edited)
827
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --[[
  2.     FALTA
  3.     restart sin recargar lua    
  4.     poder cambiar la cantidad de tiempo y mapas en la interfaz y no en el codigo [Se puede desde el chat]
  5.  
  6. ▄▄▄█████▓█     █░▒█████     ▄▄▄█████▓█████▄▄▄      ███▄ ▄███▓ ██████
  7. ▓  ██▒ ▓▓█░ █ ░█▒██▒  ██▒   ▓  ██▒ ▓▓█   ▒████▄   ▓██▒▀█▀ ██▒██    ▒
  8. ▒ ▓██░ ▒▒█░ █ ░█▒██░  ██▒   ▒ ▓██░ ▒▒███ ▒██  ▀█▄ ▓██    ▓██░ ▓██▄  
  9. ░ ▓██▓ ░░█░ █ ░█▒██   ██░   ░ ▓██▓ ░▒▓█  ░██▄▄▄▄██▒██    ▒██  ▒   ██▒
  10.   ▒██▒ ░░░██▒██▓░ ████▓▒░     ▒██▒ ░░▒████▓█   ▓██▒██▒   ░██▒██████▒▒
  11.   ▒ ░░  ░ ▓░▒ ▒ ░ ▒░▒░▒░      ▒ ░░  ░░ ▒░ ▒▒   ▓▒█░ ▒░   ░  ▒ ▒▓▒ ▒ ░
  12.     ░     ▒ ░ ░   ░ ▒ ▒░        ░    ░ ░  ░▒   ▒▒ ░  ░      ░ ░▒  ░ ░
  13.   ░       ░   ░ ░ ░ ░ ▒       ░        ░   ░   ▒  ░      ░  ░  ░  ░  
  14.             ░       ░ ░                ░  ░    ░  ░      ░        ░  
  15.                 by Blood#3565 and Misterthepro#0000
  16.              version 1.0
  17.  
  18. ]]
  19.  
  20. --[[
  21.     Comandos:
  22.     !team1 [player] -- Establece los jugadores del equipo 1
  23.     !team2 [player] -- Establece los jugadores del equipo 2
  24.     !add team1 [player] -- Añade jugadores al equipo 1
  25.     !add team2 [player] -- Añade jugadores al equipo 2
  26.     !next o !n -- Cambia al siguiente mapa en el lobby
  27.     !timemap [segundos] o !maptime [segundos] o !tm [segundos] o !mt [segundos] -- Cambia en segundos el tiempo de cada mapa
  28.     !maps [cantidad] o !mapas [cantidad] o !m [cantidad] -- Cambia la cantidad total de mapas a jugar
  29.     !addtime [segundos] -- Añade segundos al mapa actual
  30.     !admin [jugador] -- Añade un nuevo admin
  31.     !unadmin [jugador] -- Elimina a un admin
  32.    
  33.  
  34.  
  35. ]]
  36.  
  37. local _, msg = pcall(nil)
  38. local admin = string.match(msg, "^(.-)%.")
  39.  
  40. --[[
  41. players = almacena la lista de jugadores de cada equipo
  42. points = los puntos de cada equipo
  43. countPlayers = la cantidad de jugadores de cada equipo
  44. ]] -- Variables más globales
  45. local admins = {
  46.     [admin] = true, -- Este pertenece a quien cargó el lua, no es necesario que lo cambies
  47.     ["Blood#3565"] = true,
  48.     ["Alditohacker#0000"] = true,
  49.     ["S_hippo#0000"] = true}
  50. local teams = {team1 = {players = {}, points = 0, countPlayers = 1, color = "<font color='#CB546B'>", totalPlayers = 0},
  51.                team2 = {players = {}, points = 0, countPlayers = 1, color = "<font color='#2F7FCC'>", totalPlayers = 0}}
  52. local playerInfo = {}
  53. local playerIn, index = "", 0 -- variable que se modifica para saber en que equipo está el jugador
  54. local mapTime = 180 -- tiempo de cada mapa bootcamp
  55. local autoJoin = "OFF"
  56. local watchingRecords = {} -- personas que tienen abierta la lista de records (Letra L)
  57. watchingRecords["always"] = true
  58. local maps = {'#13', '#3'}
  59. --local maps = {'7053913', '7053913'}
  60. local mapsPlayed, mapsToPlay = 0, 3 -- Mapas Jugados / Mapas por jugar
  61. local actualMap = 666666 -- código del mapa
  62. local os_time = os.time
  63.  
  64. -- Colores
  65. local verde = "<font color='#00C17C'>"
  66. local morado = "<font color='#C53DFF'>"
  67.  
  68. -- Variables que se deberían resetear al iniciar un nuevo mapa:
  69. main = function()
  70.     toRespawn = {}
  71.     primerPuesto, segundoPuesto, tercerPuesto = false, false, false
  72.     times = {}
  73.     countTimes = 1
  74.     recordsString = "\n<textformat tabstops='[29, 205]'>"
  75.     putAmount()
  76. end
  77.  
  78. -- Variables que se deberían resetear al iniciar una nueva partida
  79. restart = function()
  80.       inGame = false
  81.       mapBc = true
  82.       bestTimes, countBestTimes = {}, 1
  83.       infoText = "<p align='center'><font color='#00C17C' size='15'><b>Pasando al siguiente mapa</b>"
  84. end
  85.  
  86. putAmount = function()
  87.     for name in next, playerInfo do --
  88.         playerInfo[name].totalAmount = playerInfo[name].totalAmount + playerInfo[name].amount
  89.         playerInfo[name].amount = 0
  90.         playerInfo[name].alreadyRespawn = false
  91.     end
  92. end
  93.  
  94. main()
  95. restart()
  96.  
  97. keys = function(name) -- activa las teclas necesarias
  98.     tfm.exec.bindKeyboard(name, 76, false, true) -- L
  99.     tfm.exec.bindKeyboard(name, 46, false, true) -- Supr
  100.     tfm.exec.bindKeyboard(name, 17, false, true) -- Ctrl
  101. end
  102.  
  103. tfm.exec.disableAutoScore()
  104. tfm.exec.disableAutoShaman()
  105. tfm.exec.disableAutoTimeLeft()
  106. tfm.exec.disableAutoNewGame()
  107. tfm.exec.disableAfkDeath()
  108. tfm.exec.disablePhysicalConsumables()
  109.  
  110. removeText = function(min, max, name)
  111.     for min = min, max do
  112.         ui.removeTextArea(min, name)
  113.     end
  114. end
  115.  
  116. inTeam = function(player) -- verifica si el jugador ya está en un team, guarda en una variable global cuál es su team y su index
  117.     for i, name in next, teams.team1.players do
  118.         if name == player then
  119.             playerIn = "team1"
  120.             index = i
  121.             return true
  122.         end
  123.     end
  124.     for i, name in next, teams.team2.players do
  125.         if name == player then
  126.             playerIn = "team2"
  127.             index = i
  128.             return true
  129.         end
  130.     end
  131. end
  132.  
  133. putColor = function(name)
  134.     if inTeam(name) then
  135.         local color = teams[playerIn].color:gsub("<font color='#", "0x"):gsub("'>", "")
  136.         tfm.exec.setNameColor(name, color)
  137.     end
  138. end
  139.  
  140. addPoints = function(name, points)
  141.     inTeam(name)
  142.     teams[playerIn].points = teams[playerIn].points + points
  143.     playerInfo[name].scorePoints = playerInfo[name].scorePoints + points
  144.     tfm.exec.setPlayerScore(name, points, true)
  145. end
  146.  
  147. addPlayerTeam = function(team, player) -- Agrega un nuevo jugador a el equipo asignado.
  148.     if tfm.get.room.playerList[player] then
  149.         if inTeam(player) then
  150.             teams[playerIn].players[index] = false
  151.         end
  152.         team.players[team.countPlayers] = player
  153.         team.countPlayers = team.countPlayers + 1
  154.         tfm.exec.respawnPlayer(player)
  155.         putColor(player)
  156.     else
  157.         print(player .. " no encontrado, no se añadió al equipo.")
  158.     end
  159. end
  160.  
  161. concatTeam = function(team) -- Retorna en string a todos los jugadores de un team, exceptuando los que sean false
  162.     local totalPlayers = ""
  163.     team.totalPlayers = 0
  164.     for _, name in next, team.players do
  165.         if name then
  166.             totalPlayers = totalPlayers .. name .. "\n"
  167.             team.totalPlayers = team.totalPlayers + 1
  168.         end
  169.     end
  170.     return totalPlayers
  171. end
  172.  
  173. sortByAmount = function(typeAmount) -- Puede ser amount o totalAmount
  174.     local aux, countAux, playersAmount = {}, 1, ""
  175.     for name in next, playerInfo do
  176.         aux[countAux] = {name, playerInfo[name][typeAmount]}
  177.         countAux = countAux + 1
  178.     end
  179.     table.sort(aux, function(k, v) return k[2] > v[2] end)
  180.    
  181.     for _, playerAmount in next, aux do
  182.         if playerAmount[2] > 0 then
  183.             inTeam(playerAmount[1])
  184.             local amount = verde .. playerAmount[2] .. "</font>"
  185.             local name = teams[playerIn].color .. playerAmount[1] .. "</font>"
  186.             playersAmount = playersAmount .. "\n" .. name .. "\t" .. amount
  187.         end
  188.     end
  189.     return playersAmount
  190.   end
  191.  
  192. mapStats = function()
  193.     local firstsPlace, playersTime, playersAmount = "", "", "<textformat tabstops='[190]'>"
  194.     -- obtengo los primeros puestos
  195.     if primerPuesto then
  196.         inTeam(primerPuesto)
  197.         primerPuesto = teams[playerIn].color .. primerPuesto .. "</font>"
  198.         firstsPlace = firstsPlace .. verde .. "\n\n01</font> " .. primerPuesto
  199.     end
  200.     if segundoPuesto then
  201.         inTeam(segundoPuesto)
  202.         segundoPuesto = teams[playerIn].color .. segundoPuesto .. "</font>"
  203.         firstsPlace = firstsPlace .. verde .."\n02</font> " .. segundoPuesto
  204.     end
  205.     if tercerPuesto then
  206.         inTeam(tercerPuesto)
  207.         tercerPuesto = teams[playerIn].color .. tercerPuesto .. "</font>"
  208.         firstsPlace = firstsPlace .. verde .."\n03</font> " .. tercerPuesto
  209.     end
  210.     -- los tiempos totales del mapa
  211.     watchRecords("always")
  212.     playersTime = recordsString:gsub("01", "</textformat><textformat tabstops='[29, 175]'>01")
  213.     -- las cantidades de cada jugador, tiene su propia funcion
  214.     playersAmount = playersAmount .. sortByAmount("amount")
  215.  
  216.     ui.addTextArea(31, "<p align='center'> <font size ='16' color='#00C17C'><b>Estadísticas", nil, 20, 137, 760, 220, 0x1E1E1E, 0x121212,
  217.     1, true)
  218.     ui.addTextArea(32, "<p align='center'><font size ='15' color='#00C17C'><b>Primeros Puestos</b></font>" .. firstsPlace,  nil, 35, 170, 230, 170, 0x2B2B2B, 0x2B2B2B, 1, true)
  219.     ui.addTextArea(33, "<p align='center'><font size ='15' color='#00C17C'><b>Cantidades</b></font></p>" .. playersAmount, nil, 285, 170, 230, 170, 0x2B2B2B, 0x2B2B2B, 1, true)
  220.     ui.addTextArea(34, "<p align='center'><font size ='15' color='#00C17C'><b>Tiempos</b></font></p>" ..  playersTime, nil, 535, 170, 230, 170, 0x2B2B2B, 0x2B2B2B, 1, true)
  221. end
  222.  
  223. scoreTimes = function()
  224.     for i, time in ipairs(times) do -- recorro toda la tabla times
  225.         if i == 1 then
  226.             addPoints(time.name, 5)
  227.             bestTimes[countBestTimes] = {name = time.name, time = time.time, map = time.map}
  228.             countBestTimes = countBestTimes + 1
  229.         elseif i == 2 then
  230.             addPoints(time.name, 4)
  231.         elseif i == 3 then
  232.             addPoints(time.name, 3)
  233.         else
  234.             return
  235.         end
  236.     end
  237. end
  238.  
  239. finalStats = function()
  240.     -- equipo ganador --
  241.     local teamWinner, totalTimes, totalAmounts = "", "\n<textformat tabstops='[72, 300]'>", "\n<textformat tabstops='[29, 325]'>"
  242.     if teams.team1.points > teams.team2.points then
  243.     teamWinner = "<font color = '#CB546B'>Team Red Wins</font>"
  244.     elseif teams.team1.points < teams.team2.points then
  245.         teamWinner = "<font color = '#2F7FCC'>Team Blue Wins</font>"
  246.     else
  247.     teamWinner = "<font color='#00C17C'>Empate jajaencerio</font>"
  248.     end
  249.     -- fin equipo ganador
  250.     -- mejores tiempos
  251.     for i, time in ipairs(bestTimes) do -- recorro toda la tabla times
  252.         if i < 10 then i = 0 .. i end -- le agrego el 0 al  inicio para que se vea 01, 02, 03 etc los 9 primeros end
  253.         inTeam(time.name)
  254.         name = teams[playerIn].color .. time.name .. "</font>"
  255.         totalTimes = totalTimes .. verde .. "@" .. time.map .. " \t" .. name .. "\t " .. verde .. time.time .. "s\n</font>" -- almaceno todos los times en un string
  256.     end
  257.     totalTimes = totalTimes .. "</textformat>"
  258.     --fin mejores tiempos
  259.  
  260.     -- mejor jugador
  261.     local scoreTop = -1
  262.     local mvpPlayer = ""
  263.     for name in pairs(playerInfo) do
  264.         if playerInfo[name].scorePoints > scoreTop then
  265.             scoreTop = playerInfo[name].scorePoints
  266.             mvpPlayer = name
  267.         end
  268.     end
  269.  
  270.     inTeam(mvpPlayer)
  271.     mvpPlayer = teams[playerIn].color .. mvpPlayer .. "</font>"
  272.     -- fin mejor jugador
  273.     -- cantidades
  274.    
  275.     totalAmounts = totalAmounts .. sortByAmount("totalAmount")
  276.     -- fin cantidades
  277.     texto = "<textformat tabstops='[310, 550]'><p align='left'>" .. mvpPlayer .. " MVP\t" .. teamWinner .. "\t<font color='#CB546B'><b>Red: " .. teams.team1.points .. "<font color='#2F7FCC'>   Blue: " .. teams.team2.points
  278.  
  279.     ui.addTextArea(60, "<p align='center'><font size ='16' color='#00C17C'><b>Estadísticas Finales\n\n\n\n\n\n\n\n\n\n\n\n" .. texto, nil, 20, 127, 760, 260, 0x1E1E1E, 0x121212, 1, true)
  280.     ui.addTextArea(61, "<p align='center'><font size ='15' color='#00C17C'><b>Cantidades Totales</b></font></p>" .. totalAmounts, nil, 35, 160, 350, 170, 0x2B2B2B, 0x2B2B2B, 1, true)
  281.     ui.addTextArea(62, "<p align='center'><font size ='15' color='#00C17C'><b>Mejores Tiempos</b></font></p>" ..  totalTimes, nil, 415, 160, 350, 170, 0x2B2B2B, 0x2B2B2B, 1, true)
  282.  
  283.  
  284. end
  285.  
  286. newMap = function() -- Empieza un nuevo mapa.
  287.     if mapsPlayed == mapsToPlay then -- JUEGO TERMINADO!
  288.         putAmount()
  289.         inGame = false
  290.         print("Juego terminado!")
  291.         removeText(31, 34, nil)
  292.         finalStats()
  293.         tfm.exec.newGame(7692636)
  294.     else
  295.         if mapBc then -- Verifica si tiene que cargar un nuevo mapa de bootcamp
  296.             local map = maps[math.random(2)] -- Acordarse de cambiar el #map por el número total de mapas
  297.             tfm.exec.newGame(map)
  298.             mapBc = false
  299.             main()
  300.             removeText(31, 34, nil)
  301.             tfm.exec.setGameTime(mapTime)
  302.  
  303.         else -- Si no, es porque es el fin de un mapa de bootcamp.
  304.             tfm.exec.newGame(7692636)
  305.             scoreTimes()
  306.             mapBc = true
  307.             mapsPlayed = mapsPlayed + 1 -- Al final del mapa en lobby, se suma +1 los mapas jugados
  308.             mapStats()
  309.             --------- TextAre de Botón
  310.             for name in next, admins do      
  311.                 ui.addTextArea(8, "", name, 770, 35, 20, 20, 0x2B2B2B, 0x121212, 1, true)
  312.                 ui.addTextArea(9, "<V><a href='event:nextMap'><font size='18'><b>»",
  313.                                 name, 771, 32, 40, 20, 0, 0, 1, true)
  314.             end
  315.             -------------
  316.             tfm.exec.setGameTime(99999)
  317.         end
  318.     end
  319. end
  320.  
  321. updateMapName = function()
  322.     local space = "\t<font color='#6A7495'>|\t"
  323.     local text = ""
  324.     if mapBc then
  325.         text =  "By Blood#3565 and Misterthepro" .. space ..
  326.         "<font color='#CB546B'>Red: " .. teams.team1.points .. space ..
  327.         "<font color='#2F7FCC'> Blue: ".. teams.team2.points .. space ..
  328.         "<J>Quedan " .. mapsToPlay - mapsPlayed .. " mapas."
  329.     else
  330.         local bestTime = "None"
  331.         if countTimes > 1 then
  332.             bestTime = times[1].name .. " " .. times[1].time .. "s"
  333.         end
  334.         text = "@" .. actualMap .. space ..
  335.         "<font color='#CB546B'>Red: " .. teams.team1.points .. space ..
  336.         "<font color='#2F7FCC'> Blue: ".. teams.team2.points .. space ..
  337.         "<J>" .. bestTime
  338.     end
  339.     tfm.exec.setUIMapName(text)
  340. end
  341.  
  342. watchRecords = function(name)
  343.     if watchingRecords[name] then -- Si no está abierto la lista de records, la abro actualizando los records.
  344.       recordsString = "\n<textformat tabstops='[29, 205]'>"
  345.       for i, time in ipairs(times) do -- recorro toda la tabla times
  346.             if i > 14 then break end
  347.             if i < 10 then
  348.                 i = 0 .. i -- le agrego el 0 al  inicio para que se vea 01, 02, 03 etc los 9 primeros
  349.             end
  350.             if #recordsString < 1850 then
  351.                 inTeam(time.name)
  352.                 local playerName = teams[playerIn].color .. time.name .. "</font>"
  353.                 recordsString = recordsString .. verde .. i .. " \t" .. playerName .. "\t " .. verde .. time.time .. "s\n</font>" -- almaceno todos los times en un string
  354.             end
  355.       end
  356.       ui.addTextArea(20, "", name, 275, 80, 250, 200, 0x2B2B2B, 0x121212, 1, true) -- textArea de fondo gris
  357.       ui.addTextArea(21, recordsString, name, 275, 80, 0, 0, 0, 0, 1, true) -- tiempos totales
  358.       ui.addTextArea(22, "<p align='center'><font size ='13' color='#00C17C'><b>Tiempos", name, 352, 65, 100, 20, 0x2B2B2B, 0x121212, 1, true)
  359.     else -- Si está abierta, entonces la cierro
  360.         removeText(20, 22, name)
  361.     end
  362. end
  363.  
  364. nextMap = function()
  365.     removeText(8, 9, nil)
  366.     if mapsPlayed == mapsToPlay then -- JUEGO TERMINADO!
  367.         infoText = "Enfrentamiento terminado"
  368.     end
  369.     ui.addTextArea(10, infoText, nil, 283, 23, 0, 25, 0x2B2B2B, 0x121212, 0.7, true)
  370.     tfm.exec.setGameTime(5)
  371. end
  372.  
  373. fillTeams = function ()
  374.     teams.team1.players = {}
  375.     teams.team2.players = {}
  376.     local intTeam, countPlayers = 1, 0
  377.     local playersWithoutTeam = {}
  378.     -- añado a todos los jugadores al mismo array
  379.     for name, p in pairs(tfm.get.room.playerList) do
  380.         countPlayers = countPlayers + 1
  381.         playersWithoutTeam[countPlayers] = name
  382.     end
  383.  
  384.     for i = 1, countPlayers do
  385.         local numJugador = math.random(countPlayers)
  386.         local playerToAdd = playersWithoutTeam[numJugador]
  387.         table.remove(playersWithoutTeam, numJugador) -- D:
  388.         if intTeam == 1 then
  389.             addPlayerTeam(teams.team1, playerToAdd)
  390.             intTeam = 2
  391.         elseif intTeam == 2 then
  392.             addPlayerTeam(teams.team2, playerToAdd)
  393.             intTeam = 1
  394.         end
  395.         countPlayers = countPlayers - 1
  396.     end
  397.     updateTexts()
  398. end
  399.  
  400. local macro_time = 2000 -- time to reset
  401. local macro_warn = 22 -- sends a warning to the admins
  402. local macro_freeze = 30 -- freezes them
  403. local macro_keys = { -- keys that antimacro detects
  404.     [38] = "Up",
  405.     [87] = "W",
  406.     [90] = "Z"
  407. }
  408. local macro_info = {}
  409. local concatenation = {}
  410.  
  411. updateTexts = function()
  412.     if not inGame then
  413.         ui.updateTextArea(2, "<p align='center'><font size='15' color='#CB546B'><b>Team 1</font><font size='12'><N>\n\n" .. concatTeam(teams.team1), nil)
  414.         ui.updateTextArea(3, "<p align='center'><font size='15' color='#2F7FCC'><b>Team 2</font><font size='12'><N>\n\n" .. concatTeam(teams.team2), nil)
  415.         ui.addTextArea(4, "<p align='center'><font size ='15'><b>Configuración</b></font><font size='12'>"
  416.         .. verde .. "\n\nAdministrador: </font>" .. morado .. admin .. "</font>"
  417.         .. "\n" .. verde .. "Mapas por jugar: </font>" .. morado .. mapsToPlay
  418.         .. "\n" .. verde .. "Tiempo por mapa: </font>" .. morado .. mapTime .. "s (" .. math.floor(mapTime / 60) .. " minutos)"
  419.         .. "\n" .. verde .. "Jugadores: </font>" .. morado .. teams.team1.totalPlayers .. "vs" .. teams.team2.totalPlayers
  420.         .. "\n" .. verde .. "AutoJoin: </font>" .. morado .. "<a href='event:autojoin'>" .. autoJoin .. "</a>"
  421.         .. "\n\n" .. verde .. "<b><a href='event:fillTeams'>Llenar Equipos</font></a></b>"
  422.         .. verde .. "\n\n\n<b><font size='14'><p align='center'><a href='event:startGame'>Empezar</a>", nil, 285, 170, 230, 190, 0x2B2B2B, 0x2B2B2B, 1, true)            
  423.     end
  424. end
  425.  
  426. --removeStats = function()
  427.  
  428. --end
  429.  
  430. -- Eventos de tfm
  431.  
  432. eventKeyboard = function(player, key)
  433.     if key == 76 then
  434.         if watchingRecords[player] then
  435.             watchingRecords[player] = false
  436.             watchRecords(player)
  437.         else
  438.             watchingRecords[player] = true
  439.             watchRecords(player)
  440.         end
  441.     elseif key == 46 or key == 17 then
  442.         tfm.exec.killPlayer(player)
  443.     end -- End if key Principal
  444.     if not macro_keys[key] then return end -- solo sigue si la tecla fue UP, W o Z
  445.     -- By tocutoeltocu
  446.     local info = macro_info[player][key]
  447.     local now = os_time()
  448.  
  449.     info[1] = info[1] + 1
  450.  
  451.     if now >= info[2] then
  452.         if info[4] then
  453.             local count = 3
  454.             concatenation[1] = "<r>[AntiMacro] <bv>"
  455.             concatenation[2] = player
  456.             concatenation[3] = "<bl> fue congelado por usar trampas!"
  457.             local data
  458.             for _key, name in next, macro_keys do
  459.                 data = macro_info[player][_key]
  460.                 count = count + 4
  461.                 concatenation[count - 3] = " "
  462.                 concatenation[count - 2] = name
  463.                 concatenation[count - 1] = ": "
  464.                 if now >= data[2] and info ~= data then
  465.                     concatenation[count] = "0"
  466.                 else
  467.                     concatenation[count] = data[1]
  468.                 end
  469.             end
  470.             local msg = table.concat(concatenation, "", 1, count)
  471.             --tfm.exec.chatMessage(msg)
  472.             print(msg)
  473.             tfm.exec.freezePlayer(player)
  474.         end
  475.         info[1] = 1
  476.         info[2] = now + macro_time
  477.         info[3] = false
  478.         info[4] = false
  479.         return
  480.     elseif not info[3] and info[1] >= macro_warn then
  481.         info[3] = true
  482.         local count = 3
  483.         concatenation[1] = "<j>[AntiMacro] <bv>"
  484.         concatenation[2] = player
  485.         concatenation[3] = "<bl> puede estar usando macros."
  486.         local data
  487.         for _key, name in next, macro_keys do
  488.             data = macro_info[player][_key]
  489.             count = count + 4
  490.             concatenation[count - 3] = " "
  491.             concatenation[count - 2] = name
  492.             concatenation[count - 1] = ": "
  493.             if now >= data[2] then
  494.                 concatenation[count] = "0"
  495.             else
  496.                 concatenation[count] = data[1]
  497.             end
  498.         end
  499.         local msg = table.concat(concatenation, "", 1, count)
  500.         print(msg)
  501.     elseif not info[4] and info[1] >= macro_freeze then
  502.         info[4] = true
  503.     end
  504. end
  505.  
  506. eventNewPlayer = function(name)
  507.     tfm.exec.setPlayerScore(name, 0)
  508.     updateMapName()
  509.     if not playerInfo[name] then
  510.         playerInfo[name] = {totalAmount = 0, amount = 0, alreadyRespawn = false, scorePoints = 0}
  511.     else
  512.         tfm.exec.setPlayerScore(name, playerInfo[name].scorePoints)
  513.     end
  514.     keys(name)
  515.     if not inGame then
  516.         startGui(name)
  517.     else
  518.         if autoJoin == "ON" and (not inTeam(name)) then
  519.             concatTeam(teams.team1)
  520.             concatTeam(teams.team2)
  521.             if teams.team1.totalPlayers <= teams.team2.totalPlayers then
  522.                 addPlayerTeam(teams.team1, name)
  523.             else
  524.                 addPlayerTeam(teams.team2, name)
  525.             end
  526.         end
  527.     end
  528.     local info = {}
  529.     for key in next, macro_keys do
  530.         info[key] = {0, os_time() + macro_time, false, false}
  531.         system.bindKeyboard(name, key, true, true)
  532.     end
  533.     macro_info[name] = info
  534. end
  535.  
  536. eventChatCommand = function(name, cmd)
  537.     if admins[name] then
  538.         local args, count = {}, 1
  539.         -- Lo que hace lo siguiente, es que por cada espacio (" ") que tengas en el comando que hayas escrito, lo separa y lo guarda todo en el array args.
  540.         -- por ejemplo, por el comando:
  541.         -- !add team1 Blood#3565
  542.         -- Lo separaria en:
  543.         ---------------------------
  544.         -- [add][team1][blood#3565]
  545.         --   1       2      3
  546.         -----------------------------
  547.         for arg in cmd:gmatch("[^%s]+") do
  548.             args[count] = arg
  549.             count = count + 1
  550.         end
  551.         if args[1] == "team1" or args[1] == "team2" then -- Agrega un jugador a algún team
  552.             teams[args[1]].players = {}
  553.             teams[args[1]].countPlayers = 1
  554.             for i = 2, count - 1 do addPlayerTeam(teams[args[1]], args[i]) end
  555.             updateTexts()
  556.         elseif args[1] == "add" then
  557.             if args[2] == "team1" or args[2] == "team2" then
  558.                 for i = 3, count - 1 do
  559.                     addPlayerTeam(teams[args[2]], args[i])
  560.                 end
  561.             end
  562.             updateTexts()
  563.         elseif args[1] == "next" or args[1] == "n" then
  564.             if mapBc then
  565.                 nextMap()
  566.             end
  567.         elseif args[1] == "skip" then
  568.             if not mapBc then
  569.                 --if countTimes > 1 then
  570.                   --  removeStats()
  571.                 --end
  572.                 mapBc = true
  573.                 newMap()
  574.             end
  575.         elseif args[1] == "addtime" then
  576.             local timeForMap = tonumber(args[2])
  577.             restante = restante / 1000
  578.             if timeForMap ~= nil then
  579.                 tfm.exec.setGameTime(restante + timeForMap)
  580.             end
  581.         elseif args[1] == "admin" and args[2] ~= nil then
  582.             admins[args[2]] = true
  583.         elseif args[1] == "unadmin" and args[2] ~= nil and args[2] ~= admin then
  584.             admins[args[2]] = false
  585.         elseif args[1] == "timemap" or args[1] == "maptime" or args[1] == "tm" or args[1] == "mt" then
  586.             local timeForMap = tonumber(args[2])
  587.             if timeForMap ~= nil then
  588.                 mapTime = timeForMap
  589.                 if not inGame then
  590.                     ui.addTextArea(4, "<p align='center'><font size ='15'><b>Configuración</b></font><font size='12'>"
  591.                     .. verde .. "\n\nAdministrador: </font>" .. morado .. admin .. "</font>"
  592.                     .. "\n" .. verde .. "Mapas por jugar: </font>" .. morado .. mapsToPlay
  593.                     .. "\n" .. verde .. "Tiempo por mapa: </font>" .. morado .. mapTime .. "s (" .. math.floor(mapTime / 60) .. " minutos)"
  594.                     .. "\n" .. verde .. "Jugadores: </font>" .. morado .. teams.team1.totalPlayers .. "vs" .. teams.team2.totalPlayers
  595.                     .. "\n" .. verde .. "AutoJoin: </font>" .. morado .. "<a href='event:autojoin'>" .. autoJoin .. "</a>"
  596.                     .. "\n\n" .. verde .. "<b><a href='event:fillTeams'>Llenar Equipos</font></a></b>"
  597.                     .. verde .. "\n\n\n<b><font size='14'><p align='center'><a href='event:startGame'>Empezar</a>", nil, 285, 170, 230, 190, 0x2B2B2B, 0x2B2B2B, 1, true)
  598.                 end
  599.             else
  600.                 print("Número invalido. No se pudo cambiar el tiempo de cada mapa.")
  601.             end
  602.         elseif args[1] == "maps" or args[1] == "mapas" or args[1] == "m" then
  603.             local mapsPlay = tonumber(args[2])
  604.             if mapsPlay ~= nil then
  605.                 mapsToPlay = mapsPlay
  606.                 if not inGame then
  607.                     updateMapName()
  608.                     ui.addTextArea(4, "<p align='center'><font size ='15'><b>Configuración</b></font><font size='12'>"
  609.                     .. verde .. "\n\nAdministrador: </font>" .. morado .. admin .. "</font>"
  610.                     .. "\n" .. verde .. "Mapas por jugar: </font>" .. morado .. mapsToPlay
  611.                     .. "\n" .. verde .. "Tiempo por mapa: </font>" .. morado .. mapTime .. "s (" .. math.floor(mapTime / 60) .. " minutos)"
  612.                     .. "\n" .. verde .. "Jugadores: </font>" .. morado .. teams.team1.totalPlayers .. "vs" .. teams.team2.totalPlayers
  613.                     .. "\n" .. verde .. "AutoJoin: </font>" .. morado .. "<a href='event:autojoin'>" .. autoJoin .. "</a>"
  614.                     .. "\n\n" .. verde .. "<b><a href='event:fillTeams'>Llenar Equipos</font></a></b>"
  615.                     .. verde .. "\n\n\n<b><font size='14'><p align='center'><a href='event:startGame'>Empezar</a>", nil, 285, 170, 230, 190, 0x2B2B2B, 0x2B2B2B, 1, true)
  616.                 end
  617.             else
  618.                 print("Número invalido. No se pudo cambiar los mapas totales.")
  619.             end
  620.         end -- End IF principal sobre comandos de administrador
  621.     end -- end if admins
  622.     if cmd == "records" then
  623.         if watchingRecords[name] then
  624.             watchingRecords[name] = false
  625.             watchRecords(name)
  626.         else
  627.             watchingRecords[name] = true
  628.             watchRecords(name)
  629.         end
  630.     end
  631. end
  632.  
  633.  
  634. eventLoop = function(currentTime, remaining)
  635.     restante = remaining
  636.     for name, time in next, toRespawn do -- Respawnea a cualquier jugador que haya muerto o ganado con 1s de descanso.
  637.         if time <= os_time() - 1000 then tfm.exec.respawnPlayer(name) putColor(name) end
  638.     end
  639.     if (remaining < 500 and inGame) then newMap() end
  640. end
  641.  
  642. eventPlayerDied = function(name) -- Lo respawneo si está en un equipo
  643.     if inTeam(name) then
  644.         toRespawn[name] = os_time()
  645.         playerInfo[name].alreadyRespawn = true
  646.     end
  647. end
  648.  
  649. eventNewGame = function() -- Mato a todas las personas que no estén en un equipo
  650.     if inGame then
  651.         for name in pairs(tfm.get.room.playerList) do
  652.             putColor(name)
  653.             if (autoJoin == "OFF") and (not inTeam(name)) then
  654.                 tfm.exec.killPlayer(name)
  655.             else
  656.                 if not inTeam(name) then
  657.                     concatTeam(teams.team1)
  658.                     concatTeam(teams.team2)
  659.                     if teams.team1.totalPlayers <= teams.team2.totalPlayers then
  660.                         addPlayerTeam(teams.team1, name)
  661.                     else
  662.                         addPlayerTeam(teams.team2, name)
  663.                     end
  664.                 end
  665.             end
  666.         end
  667.     end
  668.     if inGame then actualMap = tfm.get.room.xmlMapInfo.mapCode end
  669.     ui.removeTextArea(10, nil)
  670.     updateMapName()
  671. end
  672.  
  673. eventTextAreaCallback = function (id, name, callback)
  674.     if not admins[name] then return end -- Si cualquiera que haga click no es admin, no hace nada
  675.  
  676.     if callback == "startGame" then
  677.         inGame = true
  678.         removeText(1, 4, nil) -- Se remueven los textareas del inicio
  679.         newMap()
  680.     elseif callback == "nextMap" then
  681.         nextMap()
  682.     elseif callback == "fillTeams" then
  683.         fillTeams()
  684.     elseif callback == "autojoin" then
  685.         if autoJoin == "ON" then
  686.             autoJoin = "OFF"
  687.         else
  688.             autoJoin = "ON"
  689.         end
  690.         ui.addTextArea(4, "<p align='center'><font size ='15'><b>Configuración</b></font><font size='12'>"
  691.         .. verde .. "\n\nAdministrador: </font>" .. morado .. admin .. "</font>"
  692.         .. "\n" .. verde .. "Mapas por jugar: </font>" .. morado .. mapsToPlay
  693.         .. "\n" .. verde .. "Tiempo por mapa: </font>" .. morado .. mapTime .. "s (" .. math.floor(mapTime / 60) .. " minutos)"
  694.         .. "\n" .. verde .. "Jugadores: </font>" .. morado .. teams.team1.totalPlayers .. "vs" .. teams.team2.totalPlayers
  695.         .. "\n" .. verde .. "AutoJoin: </font>" .. morado .. "<a href='event:autojoin'>" .. autoJoin .. "</a>"
  696.         .. "\n\n" .. verde .. "<b><a href='event:fillTeams'>Llenar Equipos</font></a></b>"
  697.         .. verde .. "\n\n\n<b><font size='14'><p align='center'><a href='event:startGame'>Empezar</a>", name, 285, 170, 230, 190, 0x2B2B2B, 0x2B2B2B, 1, true)
  698.  
  699.     end
  700. end
  701.  
  702. eventPlayerWon = function(player, timeElapsed, timeRespawn)
  703.     -- consigo el team del jugador
  704.     local completedIn = timeRespawn / 100
  705.     -- dependiendo del puesto en el que llegó, le doy puntos a él y a su equipo
  706.     if not primerPuesto then
  707.         primerPuesto = player
  708.         addPoints(player, 5)
  709.     elseif not segundoPuesto then
  710.         segundoPuesto = player
  711.         addPoints(player, 4)
  712.     elseif not tercerPuesto then
  713.         tercerPuesto = player
  714.         addPoints(player, 3)
  715.     else
  716.         addPoints(player, 2)
  717.     end
  718.     -- le aumento en 1 sus cantidades
  719.     playerInfo[player].amount = playerInfo[player].amount + 1
  720.     toRespawn[player] = os_time()
  721.     if not playerInfo[player].alreadyRespawn then
  722.         completedIn = completedIn - 3
  723.         playerInfo[player].alreadyRespawn = true
  724.     end
  725.     -- Almaceno el time en la variable que tiene todos los tiempos del mapa:
  726.     times[countTimes] = {time = completedIn, name = player, map = actualMap}
  727.     countTimes = countTimes + 1
  728.     -- Ordeno los tiempos:
  729.     table.sort(times, function(i, v) return i.time < v.time end)
  730.     --
  731.     for name in next, watchingRecords do
  732.         watchRecords(name)
  733.     end
  734.     updateMapName()
  735. end
  736.  
  737. startGui = function(name) -- interfaz gráfica inicial
  738. ui.addTextArea(1, "<p align='center'> <font size ='16' color='#00C17C'><b>Información Inicial", name, 20, 137, 760, 240, 0x1E1E1E, 0x121212,
  739.  1, true)
  740.  ui.addTextArea (2, "<p align='center'><font size='15' color='#CB546B'><b>Team 1</font><font size='12'><N>\n\n" .. concatTeam(teams.team1), name, 35, 170, 230, 190, 0x2B2B2B, 0x2B2B2B, 1, true)
  741.  ui.addTextArea(3, "<p align='center'><font size='15' color='#2F7FCC'><b>Team 2</font><font size='12'><N>\n\n" .. concatTeam(teams.team2), name, 535, 170, 230, 190, 0x2B2B2B, 0x2B2B2B, 1, true)
  742.  ui.addTextArea(4, "<p align='center'><font size ='15'><b>Configuración</b></font><font size='12'>"
  743.  .. verde .. "\n\nAdministrador: </font>" .. morado .. admin .. "</font>"
  744.  .. "\n" .. verde .. "Mapas por jugar: </font>" .. morado .. mapsToPlay
  745.  .. "\n" .. verde .. "Tiempo por mapa: </font>" .. morado .. mapTime .. "s (" .. math.floor(mapTime / 60) .. " minutos)"
  746.  .. "\n" .. verde .. "Jugadores: </font>" .. morado .. teams.team1.totalPlayers .. "vs" .. teams.team2.totalPlayers
  747.  .. "\n" .. verde .. "AutoJoin: </font>" .. morado .. "<a href='event:autojoin'>" .. autoJoin .. "</a>"
  748.  .. "\n\n" .. verde .. "<b><a href='event:fillTeams'>Llenar Equipos</font></a></b>"
  749.  .. verde .. "\n\n\n<b><font size='14'><p align='center'><a href='event:startGame'>Empezar</a>", name, 285, 170, 230, 190, 0x2B2B2B, 0x2B2B2B, 1, true)
  750. end
  751.  
  752. for name in pairs(tfm.get.room.playerList) do eventNewPlayer(name) end
  753.  
  754. tfm.exec.newGame(7692636)
RAW Paste Data