package Ġcom . github . l azo young . craft games . impl . game . module Ċ Ċ import Ġcom . github . l azo young . craft games . api . module . Team Module Ċ import Ġcom . github . l azo young . craft games . api . tag . coordinate . Coord Tag Ċ import Ġcom . github . l azo young . craft games . api . tag . coordinate . Tag Mode Ċ import Ġcom . github . l azo young . craft games . impl . game . Game Ċ import Ġorg . bukkit . Bu kkit Ċ import Ġorg . bukkit . Chat Color Ċ import Ġorg . bukkit . entity . Player Ċ import Ġorg . bukkit . score board . Objective Ċ import Ġorg . bukkit . score board . Score Ċ import Ġorg . bukkit . score board . Score board Ċ import Ġorg . bukkit . score board . Team Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . HashMap Ċ import Ġkotlin . math . round ToInt Ċ Ċ class ĠTeam Module Service ( private Ġval Ġgame : ĠGame ) Ġ: ĠTeam Module , ĠService Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġspawn Tag Ġ= ĠHashMap < String , ĠCoord Tag >() ĊĠĠĠ Ġprivate Ġval Ġscore board Ġ= ĠBu kkit . get Score board Manager (). new Score board ĊĠĠĠ Ġprivate Ġval Ġscript Ġ= Ġgame . resource . main Script ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Team ( team Name : ĠString , Ġcolor : ĠChat Color ): ĠTeam Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġteam Ġ= Ġscore board . register New Team ( team Name ) ĊĊĠĠĠĠĠĠĠ Ġteam . color Ġ= Ġcolor ĊĠĠĠĠĠĠĠ Ġteam . prefix Ġ= Ġcolor . toString () ĊĠĠĠĠĠĠĠ Ġteam . suffix Ġ= ĠChat Color . RESET . toString () ĊĠĠĠĠĠĠĠ Ġreturn Ġteam ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Score board (): ĠScore board Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġscore board ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Player Team ( player : ĠPlayer ): ĠTeam ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġscore board . getEntry Team ( player . name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Players ( team : ĠTeam ): ĠList < Player > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġteam . entries . map NotNull Ġ{ ĠBu kkit . getPlayer ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Top Player Score ( objective : ĠObjective ): ĠScore Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplayers Ġ= Ġgame . getPlayer Service (). get Living Players () ĊĠĠĠĠĠĠĠ Ġvar Ġtop Score Ġ= Ġobjective . get Score ( players . first (). name ) ĊĊĠĠĠĠĠĠĠ Ġplayers . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscore Ġ= Ġobjective . get Score ( it . name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( score . score Ġ> Ġtop Score . score ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Score Ġ= Ġscore ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtop Score ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĠTODO ĠRewrite Ġscore Ġcalculation Ġmethods ĊĠĠĠ Ġfun Ġget Top Team Score ( objective : ĠObjective ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġteams Ġ= Ġscore board . teams ĊĠĠĠĠĠĠĠ Ġval Ġtop Teams ĊĠĠĠ Ġ} ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġoverride Ġfun Ġget Top Teams ( objective : ĠObjective ): ĠList < Team > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġteams Ġ= Ġscore board . teams ĊĠĠĠĠĠĠĠ Ġval Ġtop Teams Ġ= Ġarray ListOf ( teams . first ()) ĊĠĠĠĠĠĠĠ Ġvar Ġtop Score Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( teams . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" No Ġteam Ġis Ġdefined .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġteams . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscore Ġ= Ġget Players ( it ). sum By Ġ{ Ġp Ġ-> Ġobjective . get Score ( p . name ). score Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( score Ġ> Ġtop Score ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Score Ġ= Ġscore ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Teams . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Teams . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( score Ġ== Ġtop Score ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Teams . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtop Teams ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Score Table ( objective : ĠObjective ): ĠMap < Team , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġteams Ġ= Ġscore board . teams ĊĠĠĠĠĠĠĠ Ġval Ġtable Ġ= ĠHashMap < Team , ĠInt >() ĊĠĠĠĠĠĠĠ Ġval Ġordered Table Ġ= ĠHashMap < Team , ĠInt >() ĊĠĠĠĠĠĠĠ Ġval Ġlink edList Ġ= ĠLinkedList ( table . entries ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( teams . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" No Ġteam Ġis Ġdefined .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġteams . forEach Ġ{ Ġtable [ it ] Ġ= Ġget Players ( it ). sum By Ġ{ Ġp Ġ-> Ġobjective . get Score ( p . name ). score Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġlink edList . sort With ( Comparator Ġ{ Ġe 1 , Ġe 2 Ġ-> Ġ( e 1 . value Ġ- Ġe 2 . value ) Ġ}) ĊĠĠĠĠĠĠĠ Ġlink edList . forEach Ġ{ Ġordered Table [ it . key ] Ġ= Ġit . value Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġordered Table ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġassign Player ( player : ĠPlayer , Ġteam : ĠTeam ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġplayer . name ĊĠĠĠĠĠĠĠ Ġval Ġlegacy Ġ= Ġscore board . getEntry Team ( name ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( legacy ?. remove Entry ( name ) Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscript . print Debug ("$ name Ġis Ġremoved Ġfrom Ġteam Ġ${ legacy . name }. ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġteam . add Entry ( name ) ĊĠĠĠĠĠĠĠ Ġscript . print Debug ("$ name Ġis Ġassigned Ġto Ġteam Ġ${ team . name }. ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġassign Players ( number : ĠInt , Ġteam : ĠTeam ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgame . getPlayer Service (). get Living Players () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġscore board . getEntry Team ( it . name ) Ġ== Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sh uffled (). take ( number ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach { Ġassign Player ( it , Ġteam ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġassign Players ( ratio : ĠFloat , Ġteam : ĠTeam ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ratio Ġ< Ġ 0 f Ġ|| Ġratio Ġ> Ġ 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Ratio Ġout Ġof Ġrange : Ġ$ ratio ") ĊĊĠĠĠĠĠĠĠ Ġval Ġset Ġ= Ġgame . getPlayer Service (). get Living Players () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġscore board . getEntry Team ( it . name ) Ġ== Ġnull Ġ}. sh uffled () ĊĠĠĠĠĠĠĠ Ġval Ġdrops Ġ= Ġ( set . size Ġ* Ġ( 1 f Ġ- Ġratio )). round ToInt () ĊĠĠĠĠĠĠĠ Ġval Ġassign ee Ġ= Ġset . drop ( dro ps ) ĊĊĠĠĠĠĠĠĠ Ġassign ee . forEach Ġ{ Ġassign Player ( it , Ġteam ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Kit ( team : ĠTeam , Ġvar arg Ġk its : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Module Ġ= Ġgame . getItem Service () ĊĠĠĠĠĠĠĠ Ġval Ġkit Map Ġ= ĠHashMap < String , ĠByteArray >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( kit Name Ġin Ġk its ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠbyteArray Ġ= Ġgame . resource . kit Data [ kit Name ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException ("$ k its Ġdoes Ġnot Ġexist .") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġkit Map [ kit Name ] Ġ= ĠbyteArray ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġitem Module . team Kit [ team . name ] Ġ= Ġkit Map ĊĠĠĠĠĠĠĠ Ġscript . print Debug (" Kit Ġ". plus ( k its . join ToString ()). plus (" Ġare Ġassigned Ġto Ġ${ team . name }. ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Spawn point ( team : ĠTeam , Ġspawn Tag : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġerror (" Deprecated Ġfunction .") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Spawn point ( team : ĠTeam , Ġtag : ĠCoord Tag ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmode Ġ= Ġtag . mode ĊĊĠĠĠĠĠĠĠ Ġrequire ( mode Ġ== ĠTag Mode . SPA WN Ġ|| Ġmode Ġ== ĠTag Mode . AREA ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Illegal Ġtag Ġmode : Ġ${ mode . label }" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . spawn Tag [ team . name ] Ġ= Ġtag ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġget Spawn point ( player : ĠPlayer ): ĠCoord Tag ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Player Team ( player )?. let Ġ{ Ġspawn Tag [ it . name ] Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstart () Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġterminate () Ġ{ ĊĠĠĠĠĠĠĠ Ġscore board . object ives . forEach ( Objective :: unregister ) ĊĠĠĠĠĠĠĠ Ġscore board . teams . forEach ( Team :: unregister ) ĊĠĠĠ Ġ} Ċ Ċ }