Advertisement
Guest User

Untitled

a guest
Oct 21st, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.02 KB | None | 0 0
  1. # DuelArena will start automatically if at least 3 players
  2. # opted in (!duel or !d) to the queue.
  3. # DuelArena will be deactivated automatically if connected players
  4. # exceed the player_limit (default 5), or if there are only 2 players left, or
  5. # if too many players opted out.
  6.  
  7. import minqlx
  8. import time
  9.  
  10. MIN_ACTIVE_PLAYERS = 3 # with <3 connected and subscribed players we deactive DuelArena
  11. MAX_ACTIVE_PLAYERS = 5 # with >5 connected players we deactivate DuelArena
  12.  
  13. class duelarena(minqlx.Plugin):
  14.  
  15.     def __init__(self):
  16.  
  17.         self.add_hook("team_switch", self.handle_switch)
  18.         self.add_hook("player_disconnect", self.handle_player_disco)
  19.         self.add_hook("player_connect", self.handle_player_connect)      
  20.         self.add_hook("game_start", self.handle_game_start)
  21.         self.add_hook("round_end", self.handle_round_end)
  22.         self.add_hook("game_end", self.handle_game_end)
  23.         self.add_command(("duel", "d"), self.cmd_duel)
  24.         self.add_command(("queue", "q"), self.cmd_printqueue)    
  25.  
  26.         self.duelmode = False  #global gametype switch
  27.         self.initduel = False  #initial player setup switch
  28.         self.psub = []         #steam_ids of players subscribed to DuelArena
  29.         self.queue = []        #queue for rotating players
  30.         self.red_score = 0     #previous score to determine winner team
  31.         self.blue_score = 0    #previous score to determine winner team
  32.         self.player_red = 0    #force spec exception for this player
  33.         self.player_blue = 0   #force spec exception for this player
  34.  
  35.     def handle_switch(self, player, old, new):
  36.         # don't allow anyone to join manually when DuelArena is activ
  37.         if self.game and new in ['red', 'blue'] and self.duelmode and self.game.state != "warmup":
  38.             # except we auto join him
  39.             if player == self.player_red or player == self.player_blue:
  40.                 return
  41.             player.put("spectator")
  42.             player.tell("^3Server is in DuelArena mode. You will automatically join. Type ^2!duel ^3or ^2!d ^3to enter or to leave the queue")
  43.  
  44.     @minqlx.delay(3)
  45.     def handle_player_connect(self, player):
  46.    
  47.         playercount = self.connected_players()
  48.    
  49.         if playercount == 3 or playercount == 5 and not self.duelmode:
  50.             self.center_print("^3Type ^2!d ^3for DuelArena!")
  51.             self.msg("^3Type ^2!d ^3for DuelArena!")  
  52.    
  53.         self.duelarena_switch()  
  54.    
  55.         dbg = "echo DUELARENA DBG: playercount {} duelmode: {} psub: {}"  
  56.         minqlx.console_command(dbg.format(playercount, self.duelmode, len(self.psub)))
  57.    
  58.     @minqlx.delay(3)
  59.     def handle_player_disco(self, player, reason):
  60.    
  61.         playercount = self.connected_players()
  62.    
  63.         if playercount == 3 or playercount == 5 and not self.duelmode:
  64.             self.center_print("^3Type ^2!d ^3for DuelArena!")
  65.             self.msg("^3Type ^2!d ^3for DuelArena!")
  66.    
  67.         self.duelarena_switch()
  68.    
  69.         if player.steam_id in self.psub:
  70.             self.psub.remove(player.steam_id)
  71.    
  72.     @minqlx.delay(3)        
  73.     def handle_game_start(self, game):
  74.    
  75.         if self.duelmode:
  76.             self.red_score = 0
  77.             self.blue_score = 0
  78.             self.init_duel()
  79.            
  80.     def handle_game_end(self, *args, **kwargs):
  81.    
  82.         #put both players back to the queue, winner first position, loser last position
  83.         if self.duelmode:
  84.  
  85.             teams = self.teams()
  86.  
  87.             if self.game.blue_score > self.blue_score:
  88.                 empty_team = "red"
  89.                 winner_team = "blue"
  90.             elif self.game.red_score > self.red_score:
  91.                 empty_team = "blue"
  92.                 winner_team = "red"
  93.             else: return  
  94.        
  95.             for _p in teams[empty_team]:
  96.                 loser = _p  
  97.        
  98.             self.queue.insert(0, loser.steam_id)    
  99.        
  100.             for _p in teams[winner_team]:
  101.                 winner = _p
  102.        
  103.             self.queue.append(winner.steam_id)  
  104.  
  105.     @minqlx.delay(1.5)
  106.     def handle_round_end(self, round_number):
  107.    
  108.         # Not in CA? Do nothing
  109.         if (self.game is None) or (self.game.type_short != "ca"): return
  110.    
  111.         if self.initduel:
  112.             self.init_duel()
  113.             return
  114.    
  115.         if self.duelmode:
  116.  
  117.             if self.game.blue_score > self.blue_score: empty_team = "red"
  118.             elif self.game.red_score > self.red_score: empty_team = "blue"
  119.             else: return # Draw or first round? Do nothing
  120.            
  121.             self.blue_score = self.game.blue_score
  122.             self.red_score = self.game.red_score
  123.  
  124.             next_player = self.queue.pop()
  125.            
  126.             cancelduel = True
  127.            
  128.             teams =  self.teams()  
  129.        
  130.             for _p in teams[empty_team]:
  131.                 loser = _p  
  132.        
  133.             for _p in teams['spectator']:
  134.                 if _p.steam_id == next_player:
  135.                     self.player_blue = _p
  136.                     self.player_red = _p
  137.                     _p.put(empty_team)
  138.                     self.queue.insert(0, loser.steam_id)
  139.                     loser.put("spectator")
  140.                     cancelduel = False
  141.            
  142.             if cancelduel: self.duelmode = False #no specs found? Deactivate DuelArena      
  143.                
  144.     def cmd_duel(self, player, msg, channel):
  145.    
  146.         if self.connected_players() > MAX_ACTIVE_PLAYERS:
  147.             player.tell("^3!duel command not available with {} or more players connected".format(MAX_ACTIVE_PLAYERS+1))
  148.             return
  149.    
  150.         if player.steam_id not in self.psub:
  151.             if player.steam_id not in self.queue: self.queue.insert(0, player.steam_id)
  152.             self.psub.append(player.steam_id)
  153.             indicator = len(self.queue) - self.queue.index(player.steam_id)
  154.             player.tell("^3You successfully opted in to the DuelArena queue. Type ^2!queue ^3or ^2!q ^3to get your queue position. Your position is ^2{}.".format(indicator))
  155.             countdown = 3 - len(self.psub)
  156.             if not self.duelmode and countdown > 0:
  157.                 self.msg("{} ^3entered the DuelArena queue. ^1{} ^3more players needed to start DuelArena. Type ^2!duel ^3or ^2!d ^3to enter DuelArena queue.".format(player.name, countdown))
  158.             else: self.msg("{} ^3entered the DuelArena. Type ^2!duel ^3or ^2!d ^3to join DuelArena queue.".format(player.name))
  159.             self.printqueue()
  160.         elif player.steam_id in self.psub:
  161.             if player.steam_id in self.queue: self.queue.remove(player.steam_id)
  162.             self.psub.remove(player.steam_id)
  163.             self.msg("{} ^3left DuelArena.".format(player.name))
  164.    
  165.         self.duelarena_switch()
  166.  
  167.     def cmd_printqueue(self, player, msg, channel):
  168.    
  169.         if self.connected_players() > MAX_ACTIVE_PLAYERS:
  170.             player.tell("^3!queue command not available with {} or more players connected".format(MAX_ACTIVE_PLAYERS+1))
  171.             return
  172.    
  173.         self.printqueue()
  174.  
  175.     def printqueue(self):
  176.    
  177.         qstring = "^3DuelArena queue: "
  178.    
  179.         for s_id in self.queue:
  180.             p = self.player(s_id)
  181.             indicator = len(self.queue) - self.queue.index(s_id)
  182.             if indicator == 1: place = "1st"
  183.             elif indicator == 2: place = "2nd"
  184.             elif indicator == 3: place = "3rd"
  185.             elif indicator == 4: place = "4th"
  186.             elif indicator == 5: place = "5th"
  187.             qstring = qstring + ("^3{}^7: ^2{} ".format(place, p.name))
  188.    
  189.         if qstring != "^3DuelArena queue: ":
  190.             self.msg(qstring)
  191.         else:
  192.             self.msg("^3There's no one in the queue yet. Type ^2!d ^3or ^2!duel ^3to enter the queue.")
  193.                            
  194.     def init_duel(self):
  195.      
  196.         self.checklists()
  197.          
  198.         for _p in self.psub:
  199.             if _p not in self.queue:
  200.                 self.queue.insert(0, _p)
  201.      
  202.         teams =  self.teams()
  203.      
  204.         self.player_red = self.player(self.queue.pop())
  205.         self.player_blue = self.player(self.queue.pop())
  206.         self.player_red.put("red")
  207.         self.player_blue.put("blue")
  208.    
  209.         # put all other players to spec        
  210.         for _p in teams['red'] + teams['blue']:
  211.             if _p != self.player_red and _p != self.player_blue:
  212.                 _p.put("spectator")
  213.        
  214.         self.initduel = False
  215.        
  216.     def duelarena_switch(self):
  217.    
  218.         self.checklists()
  219.    
  220.         if self.duelmode:
  221.             player_count = self.connected_players()
  222.             if player_count > MAX_ACTIVE_PLAYERS or player_count < MIN_ACTIVE_PLAYERS or len(self.psub) < MIN_ACTIVE_PLAYERS:
  223.                 self.duelmode = False
  224.                 self.msg("^3DuelArena has been deactivated! You are free to join.")
  225.         elif not self.duelmode:
  226.             if len(self.psub) >= MIN_ACTIVE_PLAYERS and len(self.psub) <= MAX_ACTIVE_PLAYERS:
  227.                 self.duelmode = True
  228.                 self.msg("^3DuelArena activated!")
  229.                 self.center_print("^3DuelArena activated!")
  230.                 if self.game and self.game.state == "in_progress":
  231.                     self.initduel = True
  232.                     self.red_score = self.game.blue_score
  233.                     self.red_score = self.game.red_score
  234.        
  235.     def checklists(self):
  236.    
  237.         for sid in self.queue:
  238.             if not self.player(sid): self.queue.remove(sid)
  239.    
  240.         for sid in self.psub:
  241.             if not self.player(sid): self.psub.remove(sid)  
  242.            
  243.         for p in self.players():
  244.             if p.ping >= 990:
  245.                 if p.steam_id in self.queue: self.queue.remove(p.steam_id)
  246.                 if p.steam_id in self.psub: self.psub.remove(p.steam_id)  
  247.            
  248. ## Helper functions
  249.                          
  250.     def connected_players(self):
  251.         teams =  self.teams()
  252.         players = int( len(teams["red"] + teams["blue"] + teams["spectator"] + teams["free"]) )
  253.         return players
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement