package Ġcom . h af ix ion . com bat log Ċ Ċ import Ġcom . serializer . java . Serializer Ċ import Ġh az ae 4 1 . minecraft . k utils . bukkit .* Ċ import Ġh az ae 4 1 . minecraft . k utils . get Ċ import Ġh az ae 4 1 . minecraft . k utils . text Of Ċ import Ġnet . md _ 5 . b ungee . api . Chat MessageType Ċ import Ġorg . bukkit . Bu kkit Ċ import Ġorg . bukkit . entity . Player Ċ import Ġorg . bukkit . event . entity . Entity Damage By Entity Event Ċ import Ġorg . bukkit . event . player . Player Quit Event Ċ import Ġorg . bukkit . scheduler . Bu kkit Runnable Ċ import Ġorg . bukkit . scheduler . Bu kkit Task Ċ import Ġjava . io . Serializable Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . collections . ArrayList Ċ import Ġkotlin . math . round ToInt Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġprint ( text Of ("& 6 p og "). to Plain Text ()) Ċ } Ċ Ċ class ĠCom bat Log Main Ġ: ĠBu kkit Plugin () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġinstance : ĠCom bat Log Main ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġlogs Ġ= Ġhash Map Of < UUID , ĠArrayList < Combat Data >>() ĊĠĠĠ Ġprivate Ġval Ġcom bat Ġ= Ġhash Map Of < Player , ĠCom bat Cache >() ĊĠĠĠ Ġprivate Ġvar Ġlast Attack : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġdelay Ġ= Ġ 2 0 0 ĊĠĠĠ Ġprivate Ġvar Ġgarbage Ġ= Ġtrue ĊĊĠĠĠ Ġoverride Ġfun Ġon Enable () Ġ{ ĊĠĠĠĠĠĠĠ Ġinstance Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġload Config () ĊĊĠĠĠĠĠĠĠ Ġ// ĠTags Ġpeople ĊĠĠĠĠĠĠĠ Ġlisten < Entity Damage By Entity Event > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . entity Ġis ĠPlayer Ġ&& Ġit . dam ager Ġis ĠPlayer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . entity . has Permission (" com bat log . ex empt ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! com bat . containsKey ( it . entity )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . entity Ġas ĠPlayer ). sp ig ot () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sendMessage ( Chat MessageType . ACTION _ BAR , Ġtext Of ("& c Combat ĠTag ged Ġfor Ġ${ delay / 2 0 } Ġseconds ! ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġcom bat [ it . entity Ġas ĠPlayer ]?. task ?. cancel () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcom bat [ it . entity Ġas ĠPlayer ] Ġ= ĠCom bat Cache ( it . dam ager . unique Id , Ġit . entity . unique Id , Ġobject Ġ: ĠBu kkit Runnable () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcom bat . remove ( it . entity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . entity Ġas ĠPlayer ). sp ig ot (). sendMessage ( Chat MessageType . ACTION _ BAR , Ġtext Of ("& a Esc aped Ġfrom ĠCom bat ! ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. run Task Later As ynchronously ( this , Ġdelay . to Long ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Attack Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠActual ĠCom bat Log Ġpart Ġof Ġthis ĊĠĠĠĠĠĠĠ Ġlisten < Player Quit Event > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . player . has Permission (" com bat log . ex empt ") Ġ&& Ġcom bat . containsKey ( it . player )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcache Ġ= Ġcom bat [ it . player ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cache Ġ!= Ġnull Ġ&& ĠBu kkit . get Offline Player ( cache . attack er ). is Online ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( logs [ cache . off ender ] Ġ== Ġnull ) Ġlogs [ cache . off ender ] Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogs [ cache . off ender ] !!. add ( Combat Data ( Point 3 D ( it . player . location . x . round ToInt (), Ġit . player . location . y . round ToInt (), Ġit . player . location . z . round ToInt ()), Ġcache . attack er )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . player . damage ( Int . MAX _ VALUE . toDouble (), ĠBu kkit . get Offline Player ( cache . attack er ). player ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġcom bat . remove ( it . player ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠG arbage ĠCollection ĊĠĠĠĠĠĠĠ ĠBu kkit . get Scheduler (). schedule Async Repe ating Task ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠBu kkit Runnable () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Attack Ġ- ĠSystem . currentTimeMillis () Ġ>= Ġ 3 0 0 0 0 0 ) Ġcom bat . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ, Ġ 3 0 0 0 0 0 , Ġ 6 0 0 0 0 ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( garbage ) Ġschedule ( true , Ġdelay Ġ= Ġ 5 , Ġperiod Ġ= Ġ 1 , ĠTimeUnit . MIN UTES ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( System . currentTimeMillis () Ġ- Ġlast Attack Ġ>= Ġ 3 0 0 0 0 ) Ġcom bat . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcommand (" com bat log ") Ġ{ Ġargs Ġ-> Ġkotlin . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( args . isNotEmpty () Ġ&& ĠBu kkit . get Offline Player ( args [ 0 ]). has Play ed Before ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuuid Ġ= ĠBu kkit . get Offline Player ( args [ 0 ]). unique Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( logs [ uuid ] Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . msg ( text Of (" Â§ 6 Â§ l ${ args [ 0 ]} ' s ĠCom bat logs ĠÂ§ m Â§ 8 âĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢ âĶĢ ". toUpperCase ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdateFormat Ġ= ĠSimpleDateFormat (" KK : m Ġa Ġ@ Ġdd ĠM MM Ġy yyy ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( com bat Ġin Ġlogs [ Bu kkit . get Offline Player ( args [ 0 ]). unique Id ] !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠBu kkit . get Offline Player ( com bat . attack er ). name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . msg ( text Of ("& e ${ args [ 0 ]} Ġcom bat - logged Ġfrom Ġ& 6 $ name & e Ġat Ġ& 6 ${ date Format . format ( com bat . time )} & e Ġon Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"& 6 ${ com bat . location . x }, Ġ${ com bat . location . y }, Ġ${ com bat . location . z } "). to Plain Text ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . msg (" Â§ m Â§ 8 âĶĢ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġthis . msg (" Â§ c ${ args [ 0 ]} Ġhas Ġnot Ġcom bat logged Ġbefore .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġthis . msg (" Â§ c No Ġvalid Ġplayer Ġspecified .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Disable () Ġ{ ĊĠĠĠĠĠĠĠ Ġconfig . set (" data ", ĠSerializer . serialize ( logs )) ĊĠĠĠĠĠĠĠ Ġconfig . save ( data Folder [" config . yml "]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Config () Ġ{ ĊĠĠĠĠĠĠĠ Ġsave Default Config () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay Ġ= Ġconfig . getInt (" delay ") Ġ* Ġ 2 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgarbage Ġ= Ġconfig . getBoolean (" trust - garbage - collection ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config . contains (" data ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogs Ġ= ĠSerializer . deserialize ( config . getString (" data ")) Ġas ĠHashMap < UUID , ĠArrayList < Combat Data >> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo (" Config Ġloaded Ġsuccessfully , Ġche ers Ġfrom ĠH af .") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwarning (" Invalid Ġconfig , Ġdefault ing Ġto Ġdefault Ġconfig . yml ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwarning (" Check Ġthat Ġall Ġvalues Ġare Ġentered Ġcorrectly , Ġfirst Ġoption Ġis Ġan Ġinteger , Ġsecond Ġis Ġa Ġboolean ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠCom bat Cache Ġ( val Ġattacker : ĠUUID , Ġval Ġoff ender : ĠUUID , Ġval Ġtask : ĠBu kkit Task ) Ġ: ĠSerializable Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( other Ġis ĠCom bat Cache ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother . attack er Ġ== Ġthis . attack er Ġ&& Ġother . off ender Ġ== Ġthis . off ender ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġattacker . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġoff ender . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġtask . hashCode () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ } Ċ class ĠCom bat Data ( val Ġlocation : ĠPoint 3 D , Ġval Ġattacker : ĠUUID , Ġval Ġtime : ĠLong Ġ= ĠSystem . currentTimeMillis ()) Ġ: ĠSerializable Ċ class ĠPoint 3 D ( var Ġx : ĠInt , Ġvar Ġy : ĠInt , Ġvar Ġz : ĠInt ) Ġ: ĠSerializable