package Ġcom . mine in aby ss . mob zy . sp aw ning Ċ Ċ import Ġcom . google . common . math . Int Math . pow Ċ import Ġcom . mine in aby ss . mob zy . mob zy Config Ċ import Ġorg . bukkit . Chunk Ċ import Ġorg . bukkit . entity . Entity Ċ import Ġorg . n ield . kotlin statistics . db Scan Cluster Ċ Ċ object ĠPlayer Groups Ġ{ ĊĠĠĠ Ġ/** ĠConverts Ġa Ġlist Ġof Ġplayers Ġto Ġlists Ġof Ġgroups Ġof Ġplayers Ġwithin Ġ 2 x Ġspawn Ġradius Ġof Ġeach Ġother . Ġ*/ ĊĠĠĠ Ġfun Ġgroup ( entities : ĠCollection < Entity >): ĠList < List < Entity >> Ġ= Ġentities ĊĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ Ġit . world Ġ} ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġ(_, Ġplayers ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayers . db Scan Cluster ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaximum Radius Ġ= Ġmob zy Config . player Group Radius , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Points Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Selector Ġ= Ġ{ Ġit . location . x Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Selector Ġ= Ġ{ Ġit . location . z Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}. map Ġ{ Ġit . points Ġ} ĊĊĊĠĠĠ Ġ@ Suppress (" FunctionName ") ĊĠĠĠ Ġprivate Ġin fix Ġfun ĠInt .` +- `( other : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ Ġthis Ġ+ Ġset Of (- 1 , Ġ 1 ). random () Ġ* Ġother ĊĊĠĠĠ Ġ/** ĠReturns Ġa Ġrandom Ġ[ Chunk ] Ġthat Ġis Ġfurther Ġthan Ġ[ mob zy Config . Data . chunk Spawn Rad ] Ġfrom Ġall Ġthe Ġplayers Ġin Ġthis ĊĠĠĠĠ Ġ* Ġlist , Ġand Ġat Ġleast Ġwithin Ġ[ mob zy Config . Data . max Chunk Spawn Rad ] Ġto Ġone Ġof Ġthem . Ġ*/ ĊĠĠĠ Ġfun Ġrandom Chunk Near ( group : ĠList < Entity >): ĠChunk ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchunk Ġ= Ġgroup . random (). location . chunk ĊĠĠĠĠĠĠĠ Ġval Ġpositions Ġ= Ġgroup . map To ( mutable Set Of ()) Ġ{ Ġit . location . chunk . x Ġto Ġit . location . chunk . z Ġ} ĊĠĠĠĠĠĠĠ Ġ// TODO Ġproper Ġmin Ġmax Ġy Ġfor Ġ 3 d Ġspace ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdist X Ġ= Ġmob zy Config . chunk Spawn Rad . random () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdist Z Ġ= Ġmob zy Config . chunk Spawn Rad . random () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew X Ġ= Ġchunk . x Ġ` +- ` Ġdist X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Z Ġ= Ġchunk . z Ġ` +- ` Ġdist Z ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpositions . none Ġ{ Ġ( x , Ġz ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdistance Squared ( new X , Ġnew Z , Ġx , Ġz ) Ġ< Ġpow ( mob zy Config . chunk Spawn Rad . first , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Chunk Ġ= Ġchunk . world . get Chunk At ( new X , Ġnew Z ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! new Chunk . is Loaded ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnew Chunk ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠGets Ġthe Ġdistance Ġsquared Ġbetween Ġbetween Ġtwo Ġpoints Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdistance Squared ( x : ĠNumber , Ġz : ĠNumber , Ġother X : ĠNumber , Ġother Z : ĠNumber ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdx Ġ= Ġ( x . toDouble () Ġ+ Ġother X . toDouble ()) ĊĠĠĠĠĠĠĠ Ġval Ġdz Ġ= Ġ( z . toDouble () Ġ+ Ġother Z . toDouble ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġdx Ġ* Ġdx Ġ+ Ġdz Ġ* Ġdz ĊĠĠĠ Ġ} Ċ } Ċ