Advertisement
Guest User

Untitled

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