package Ġme . ih developer . hum ans . core . system Ċ Ċ import Ġkotlin . math . max Ċ import Ġkotlin . random . Random Ċ import Ġme . ih developer . hum ans . core . Boss Bar Ċ import Ġme . ih developer . hum ans . core . System Ċ import Ġme . ih developer . hum ans . core . entity . connection Ċ import Ġme . ih developer . hum ans . core . set Private Field Ċ import Ġme . ih developer . hum ans . core . util . Game Logger Ċ import Ġme . ih developer . hum ans . core . util . Reflect Util Ċ import Ġme . ih developer . hum ans . core . util . to N MS Ċ import Ġnet . minecraft . server . v 1 _ 8 _ R 3 . Data Watcher Ċ import Ġnet . minecraft . server . v 1 _ 8 _ R 3 . Math Helper Ċ import Ġnet . minecraft . server . v 1 _ 8 _ R 3 . Packet Play Out Entity Destroy Ċ import Ġnet . minecraft . server . v 1 _ 8 _ R 3 . Packet Play Out Entity Metadata Ċ import Ġnet . minecraft . server . v 1 _ 8 _ R 3 . Packet Play Out Entity Teleport Ċ import Ġnet . minecraft . server . v 1 _ 8 _ R 3 . Packet Play Out Spawn Entity Living Ċ import Ġorg . bukkit . Location Ċ import Ġorg . bukkit . entity . Player Ċ import Ġorg . bukkit . event . EventHandler Ċ import Ġorg . bukkit . event . Event Priority Ċ import Ġorg . bukkit . event . Listener Ċ import Ġorg . bukkit . event . player . Player Move Event Ċ import Ġorg . bukkit . event . player . Player Quit Event Ċ import Ġorg . bukkit . event . player . Player Teleport Event Ċ import Ġorg . bukkit . plugin . java . Java Plugin Ċ Ċ private Ġconst Ġval ĠWIT HER _ TRACK ER _ DISTANCE Ġ= Ġ 4 8 Ċ Ċ private Ġconst Ġval ĠWIT HER _ ID Ġ= Ġ 6 4 Ċ Ċ private Ġconst Ġval ĠCUSTOM _ NAME _ KEY Ġ= Ġ 2 Ċ private Ġconst Ġval ĠCUSTOM _ NAME _ VISIBLE _ KEY Ġ= Ġ 3 Ċ private Ġconst Ġval ĠHE ALTH _ KEY Ġ= Ġ 6 Ċ Ċ private Ġconst Ġval ĠWIT HER _ INV UL NER ABILITY _ KEY Ġ= Ġ 2 0 Ċ Ċ /** Ċ Ġ* ĠRepresents Ġdata Ġabout Ġthe Ġentity Ġof Ġthe Ġboss Ġbar Ċ Ġ*/ Ċ internal Ġclass ĠBo ss Bar Meta ( ĊĠĠĠ Ġinternal Ġval Ġid : ĠInt , ĊĠĠĠ Ġinternal Ġvar Ġlocation : ĠLocation , Ċ ) Ġ{ ĊĠĠĠ Ġinternal Ġvar Ġdata Watcher Ġ= ĠData Watcher ( null ) Ċ } Ċ Ċ class ĠBo ss Bar System Ġ: ĠSystem (" Core / Boss - Bar "), ĠListener Ġ Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġlogger : ĠGame Logger ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġplayers Ġ= Ġmutable Map Of < String , ĠBo ss Bar >() ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġrandom Ġ= ĠRandom ( 2 0 3 0 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmet as Ġ= Ġmutable Map Of < String , ĠBo ss Bar Meta >() ĊĊĠĠĠĠĠĠĠ Ġfun Ġspawn ( boss Bar : ĠBo ss Bar , Ġplayer : ĠPlayer ) Ġ= Ġspawn ( boss Bar , Ġplayer , Ġplayer . location ) ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġspawn ( boss Bar : ĠBo ss Bar , Ġplayer : ĠPlayer , Ġlocation : ĠLocation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( players . containsKey ( player . name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestroy ( player ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayers [ player . name ] Ġ= Ġboss Bar ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboss Bar . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmeta Ġ= ĠBo ss Bar Meta ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġrandom . nextInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Ġ= Ġlocation . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirection . multiply ( WIT HER _ TRACK ER _ DISTANCE ). add ( to Vector ()). to Location ( world ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmet as [ player . name ] Ġ= Ġmeta ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . to N MS (). connection . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeta . data Watcher . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Initializing Ġdata Ġwatcher Ġfor Ġthe Ġboss Ġbar ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĠEntity ĠFlag Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( 0 , Ġ( 0 Ġor Ġ 1 Ġshl Ġ 5 ). to Byte ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĠEntity Ġliving Ġflags Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( CUSTOM _ NAME _ VISIBLE _ KEY , Ġ 1 . to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Ġ( boss Bar ) Ġ{ Ġadd ( HE ALTH _ KEY , Ġpercentage ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĠMaximum Ġlength Ġin Ġa Ġname Ġis Ġ 6 4 Ġcharacters Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( CUSTOM _ NAME _ KEY , Ġboss Bar . title ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĠEntity Ġwith er Ġflags Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( 1 7 , ĠInteger ( 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( 1 8 , ĠInteger ( 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( 1 9 , ĠInteger ( 0 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( WIT HER _ INV UL NER ABILITY _ KEY , ĠInteger ( 1 0 0 0 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Initialized ! ĠThe Ġdata Ġwatcher Ġfor Ġthe Ġboss Ġbar ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Packet ( Packet Play Out Spawn Entity Living (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Private Field ( this , Ġ" a ", Ġmeta . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Private Field ( this , Ġ" b ", ĠWIT HER _ ID ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeta . location . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Private Field ( this , Ġ" c ", Ġit . block X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Private Field ( this , Ġ" d ", ĠMath Helper . floor ( it . y Ġ* Ġ 3 2 . 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Private Field ( this , Ġ" e ", Ġit . block Z ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Private Field ( this , Ġ" i ", Ġ(( it . yaw Ġ* Ġ 2 5 6 . 0 Ġ/ Ġ 3 6 0 . 0 ). toInt ()). to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Private Field ( this , Ġ" j ", Ġ(( it . pitch Ġ* Ġ 2 5 6 . 0 Ġ/ Ġ 3 6 0 . 0 ). toInt ()). to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Private Field ( this , Ġ" k ", Ġ(( it . pitch Ġ* Ġ 2 5 6 . 0 Ġ/ Ġ 3 6 0 . 0 ). toInt ()). to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Private Field ( this , Ġ" f ", Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Private Field ( this , Ġ" g ", Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Private Field ( this , Ġ" h ", Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Private Field ( this , Ġ" l ", Ġmeta . data Watcher ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġupdate ( player : ĠPlayer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayers [ player . name ]?. let Ġ{ Ġboss Bar Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmeta Ġ= Ġmet as [ player . name ] !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeta . data Watcher . let Ġ{ Ġdata Watcher Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Ġ( boss Bar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcustom Name Updated Ġ= Ġdata Watcher . update ( CUSTOM _ NAME _ KEY , Ġtitle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhealth Updated Ġ= Ġdata Watcher . update ( HE ALTH _ KEY , Ġpercentage ()) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( custom Name Updated Ġ|| Ġhealth Updated ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . to N MS (). connection . send Packet ( Packet Play Out Entity Metadata ( meta . id , Ġdata Watcher , Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġdestroy ( player : ĠPlayer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmet as [ player . name ]?. let Ġ{ Ġmeta Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Destroy ing Ġboss Ġbar Ġfor Ġ${ player . name } ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayers . remove ( player . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmet as . remove ( player . name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . to N MS (). connection . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Packet ( Packet Play Out Entity Destroy ( meta . id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġtele port ( player : ĠPlayer , Ġto : ĠLocation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmet as [ player . name ]?. let Ġ{ Ġmeta Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . to N MS (). connection . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeta . location Ġ= Ġ( to . direction . multiply ( WIT HER _ TRACK ER _ DISTANCE ). add ( to . to Vector ()). to Location ( to . world )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Packet ( Packet Play Out Entity Teleport (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Private Field ( this , Ġ" a ", Ġmeta . id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeta . location . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Private Field ( this , Ġ" b ", ĠMath Helper . floor ( it . x Ġ* Ġ 3 2 . 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Private Field ( this , Ġ" c ", ĠMath Helper . floor ( it . y Ġ* Ġ 3 2 . 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Private Field ( this , Ġ" d ", ĠMath Helper . floor ( it . z Ġ* Ġ 3 2 . 0 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Private Field ( this , Ġ" e ", Ġ(( it . yaw Ġ* Ġ 2 5 6 . 0 Ġ/ Ġ 3 6 0 . 0 ). toInt ()). to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Private Field ( this , Ġ" f ", Ġ(( it . pitch Ġ* Ġ 2 5 6 . 0 Ġ/ Ġ 3 6 0 . 0 ). toInt ()). to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Private Field ( this , Ġ" g ", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠData Watcher . add ( key : ĠInt , Ġvalue : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Adding Ġdata Ġwatcher Ġwith Ġkey Ġ$ key Ġ( value =$ value ) Ġ[ ${ value :: class . qualified Name }] ...") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa ( key , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠData Watcher . update ( key : ĠInt , Ġvalue : ĠAny ) Ġ= ĠReflect Util . N MS Data Watcher . update ( this , Ġkey , Ġvalue ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠBo ss Bar . percentage (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ġ== Ġmax ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 3 0 0 F ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmax ((( current Ġ* Ġ 3 0 0 F ) Ġ/ Ġmax ), Ġ 1 F ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinit ( plugin : ĠJava Plugin ) Ġ{ ĊĠĠĠĠĠĠĠ ĠComp anion . logger Ġ= Ġlogger ĊĊĠĠĠĠĠĠĠ Ġplugin . server . plugin Manager . register Events ( this , Ġplugin ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispose () Ġ{} ĊĊĠĠĠ Ġ@ EventHandler ( priority Ġ= ĠEvent Priority . LOW EST ) ĊĠĠĠ Ġ@ Suppress (" UNUSED ") ĊĠĠĠ Ġfun Ġon Move ( event : ĠPlayer Move Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġevent . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtele port ( player , Ġevent . to ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ EventHandler ( priority Ġ= ĠEvent Priority . LOW EST ) ĊĠĠĠ Ġ@ Suppress (" UNUSED ") ĊĠĠĠ Ġfun Ġon Teleport ( event : ĠPlayer Teleport Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġevent . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayers [ player . name ]?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestroy ( player ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspawn ( this , Ġplayer , Ġto ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ EventHandler ( priority Ġ= ĠEvent Priority . LOW EST ) ĊĠĠĠ Ġ@ Suppress (" UNUSED ") ĊĠĠĠ Ġfun Ġon Quit ( event : ĠPlayer Quit Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġevent . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestroy ( event . player ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ