package Ġcom . github . l azo young . craft games . api Ċ Ċ import Ġcom . github . l azo young . craft games . impl . Main Ċ import Ġorg . bukkit . entity . Player Ċ import Ġorg . bukkit . scheduler . Bu kkit Runnable Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Concurrent Linked Queue Ċ import Ġkotlin . collections . HashMap Ċ import Ġkotlin . math . ceil Ċ Ċ class ĠAction bar Task ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġplayer : ĠPlayer , ĊĠĠĠĠĠĠĠ Ġperiod : ĠTimer Ġ= ĠTimer ( TimeUnit . SECOND , Ġ 5 ), ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġrepeat : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġprivate Ġvar arg Ġval Ġtext : ĠString Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġactive Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġvar Ġid Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġval Ġtask Period Ġ= Ġ 1 0 L ĊĠĠĠ Ġprivate Ġval Ġrunnable : ĠBu kkit Runnable ĊĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer : ĠPlayer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext : ĠString ĊĠĠĠ Ġ): Ġthis ( player , Ġrepeat Ġ= Ġfalse , Ġtext Ġ= Ġ* array Of ( text )) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ ĠEach Ġtext - line Ġis Ġrepeated Ġthis Ġamount Ġof Ġtimes ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġto Ġensure Ġthat Ġaction bar Ġwon 't Ġfade Ġout Ġbetween Ġinterval . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġrepeat Count Ġ= Ġceil ( period . to Tick () Ġ/ Ġtask Period . toDouble ()). toInt () ĊĊĠĠĠĠĠĠĠ Ġrunnable Ġ= Ġobject Ġ: ĠBu kkit Runnable () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrepeat Ġ= Ġrepeat Count ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! player . is Online ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( active ) Ġ{ Ġ// ĠPrevent Ġconcurrent Ġactions Ġfrom Ġo var lapping ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . send ActionBar ('& ', Ġtext [ index ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(-- repeat Ġ> Ġ 0 ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(++ index Ġ< Ġtext . size ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat Ġ= Ġrepeat Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Action bar Task . repeat Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat Ġ= Ġrepeat Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġregister Task ( player , Ġthis ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġregistry Ġ= ĠHashMap < UUID , ĠConcurrent Linked Queue < Action bar Task >>() ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġnext ID Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġfun Ġclear All ( player : ĠPlayer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregistry . compute If Present ( player . unique Id ) Ġ{ Ġ_, Ġlist Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . forEach ( Action bar Task :: clear ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregistry . remove ( player . unique Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġregister Task ( player : ĠPlayer , Ġtask : ĠAction bar Task ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuid Ġ= Ġplayer . unique Id ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( registry . containsKey ( uid )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregistry . compute ( uid ) Ġ{ Ġ_, Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue !!. forEach Ġ{ Ġit . active Ġ= Ġfalse Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . id Ġ= Ġnext ID ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . add ( task ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregistry . compute If Absent ( uid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . id Ġ= Ġnext ID ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqueue Ġ= ĠConcurrent Linked Queue < Action bar Task >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . add ( task ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġdrop Task ( player : ĠPlayer , Ġtask : ĠAction bar Task ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuid Ġ= Ġplayer . unique Id ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġregistry . compute If Present ( uid ) Ġ{ Ġ_, Ġlist Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiter Ġ= Ġlist . iterator () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( iter . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( iter . next (). id Ġ== Ġtask . id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiter . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . last OrNull ()?. active Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart (): ĠAction bar Task Ġ{ ĊĠĠĠĠĠĠĠ Ġrunnable . run Task Timer ( Main . instance , Ġ 0 L , Ġtask Period ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrunnable . cancel () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalStateException ) Ġ{} ĊĊĠĠĠĠĠĠĠ Ġdrop Task ( player , Ġthis ) ĊĠĠĠ Ġ} Ċ Ċ }