package Ġme . ch as ert w 1 2 3 . min ig ames . b ungee . queue . v 2 Ċ Ċ import Ġme . ch as ert w 1 2 3 . min ig ames . b ungee . Main Ċ import Ġme . ch as ert w 1 2 3 . min ig ames . b ungee . d ss . Min ig ame Server Ċ import Ġme . ch as ert w 1 2 3 . min ig ames . b ungee . user . User Ċ import Ġme . ch as ert w 1 2 3 . min ig ames . b ungee . utils . Y ML Config Ċ import Ġme . ch as ert w 1 2 3 . min ig ames . shared . database . Database Ċ import Ġme . ch as ert w 1 2 3 . min ig ames . shared . framework . Server Game Type Ċ import Ġnet . md _ 5 . b ungee . B ungee C ord Ċ Ċ class ĠQueue Controller Ġ{ ĊĊĠĠĠ Ġvar Ġqueue Load s Ġ= Ġmutable ListOf < Queue Group >() ĊĊĠĠĠ Ġvar Ġservers Ġ= Ġmutable ListOf < Server Instance >() ĊĠĠĠ Ġvar Ġgame Modes Ġ= Ġmutable ListOf < String >() Ġ// ĠThe Ġgame mode Ġlist ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠLoad Ġin Ġdata Ġfrom Ġconfig Ġfiles ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠY ML Config . getConfig (" config . yml ") ĊĊĠĠĠĠĠĠĠ Ġgame Modes Ġ= Ġconfig . getString List (" game modes ") ĊĊĠĠĠĠĠĠĠ Ġgame Modes . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġeach Ġserver ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . getString List (" servers .$ it "). forEach Ġ{ Ġserver Item Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservers . add ( Server Instance ( server Item , ĠServer State . RE START ING , ĠServer Game Type . valueOf ( it . toUpperCase (). replace ("- ", Ġ"_ ")), Ġ 0 , Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠQueue Ġfunctions ĊĠĠĠ Ġfun ĠaddTo Queue ( group : ĠQueue Group ) Ġ{ ĊĠĠĠĠĠĠĠ Ġqueue Load s . add ( group ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġthe Ġcurrent Ġserver Ġlist Ġcontains Ġa Ġserver Ġthat Ġis Ġof Ġthe Ġtype Ġthese Ġplayers Ġwant . ĊĠĠĠĠĠĠĠ Ġvar Ġfound Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġprintln (" Checking Ġ${ servers . size } Ġservers .") ĊĊĠĠĠĠĠĠĠ Ġfor ( s Ġin Ġservers ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( s . game Type Ġ== Ġgroup . type Ġ&& Ġ( s . state Ġ== ĠServer State . LO BB Y Ġ|| Ġs . state Ġ== ĠServer State . RE START ING )) Ġ{ Ġ// ĠRe starting Ġbecause Ġit Ġmay Ġbe Ġa Ġstarting Ġdynamic Ġserver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfound Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( found ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġprintln (" Creating Ġa Ġnew Ġserver Ġwith Ġthe Ġgame mode Ġof Ġ${ group . type } Ġbecause Ġone Ġdoesn 't Ġcurrently Ġexist .") ĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġnew ĠMin ig ame ĠServer Ġwith Ġthis Ġgame mode . ĊĠĠĠĠĠĠĠ ĠMain . getInstance (). dynamic Server System Manager . register Server ( Min ig ame Server ( group . type )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove From Queue ( group : ĠQueue Group ) Ġ{ ĊĠĠĠĠĠĠĠ Ġqueue Load s . remove ( group ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Server ( server Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġto Remove : ĠServer Instance ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfor ( s Ġin Ġservers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s . name Ġ== Ġserver Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Remove Ġ= Ġs ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( to Remove Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservers . remove ( to Remove ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove From Queue ( user : ĠUser ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġwhat Ġqueue Ġload Ġthey Ġare Ġin . ĊĠĠĠĠĠĠĠ Ġvar Ġqueue Group : ĠQueue Group ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfor ( gq Ġin Ġqueue Load s ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( uuid Ġin Ġg q . players ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( user . uuid Ġ== Ġuuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue Group Ġ= Ġg q ĊĊĠĠĠĠĠĠĠ Ġif ( queue Group Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġif ( queue Group . players . size Ġ- Ġ 1 Ġ<= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove From Queue ( queue Group ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġqueue Group . players . remove ( user . uuid ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠisIn Queue ( user : ĠUser ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor ( qg Ġin Ġqueue Load s ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( uuid Ġin Ġq g . players ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( user . uuid Ġ== Ġuuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprocess Queue () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDownload Ġall Ġof Ġthe Ġserver Ġinformation ĊĠĠĠĠĠĠĠ Ġval Ġto Delete Ġ= Ġmutable ListOf < Server Instance >() ĊĊĠĠĠĠĠĠĠ Ġfor ( d Ġin ĠMain . getInstance (). database . get Mongo Collection ( Database . Collection . SERVER _ STATUS ). find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFind Ġthe Ġserver ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservers . filter Ġ{ Ġit . name . equals ( d . getString (" server name "), Ġtrue ) Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . max Players Ġ= Ġd . getInteger (" max players ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . player Count Ġ= Ġd . getInteger (" c urren tp layers ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . state Ġ= ĠServer State . from Id ( d . getInteger (" status ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDelete Ġthis Ġserver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( it . state Ġ== ĠServer State . DELETE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Delete . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġto Delete . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMain . getInstance (). dynamic Server System Manager . delete Server ( it . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservers . remove ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġto Remove Ġ= Ġmutable ListOf < Queue Group >() ĊĊĠĠĠĠĠĠĠ Ġ// ĠIterate Ġthrough Ġthe Ġqueue Ġand Ġdistribute Ġfrom Ġthis . ĊĠĠĠĠĠĠĠ Ġqueue Load s . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfound Server Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFilter Ġdown Ġto Ġonly Ġwhat Ġis Ġjoin able Ġfor Ġthe Ġentire Ġgroup , Ġand Ġmatches Ġtheir Ġsearch . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpossible Servers Ġ= Ġservers . filter Ġ{ Ġserver Ġ-> Ġserver . game Type Ġ== Ġit . type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġserver . max Players Ġ- Ġserver . player Count Ġ>= Ġit . players . size Ġ&& Ġserver . state Ġ=== ĠServer State . LO BB Y Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( possible Servers . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfound Server Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . players . forEach Ġ{ Ġuuid Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB ungee C ord . getInstance (). getPlayer ( uuid ). connect ( B ungee C ord . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getServer Info ( possible Servers [ 0 ]. name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpossible Servers [ 0 ]. player Count Ġ+= Ġit . players . size Ġ// ĠUpdate Ġit Ġfor Ġnext Ġiteration . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( found Server ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Remove . add ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġto Remove . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġqueue Load s . remove ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }