package Ġspi Ċ Ċ import Ġconfigs . Conf Ċ import Ġkotlinx . serialization . Internal Serialization Api Ċ import Ġkotlinx . serialization . K Serializer Ċ import Ġkotlinx . serialization . Serializable Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġorg . bukkit . Bu kkit Ċ import Ġorg . bukkit . event . player . Player Join Event Ċ import Ġorg . bukkit . event . player . Player Quit Event Ċ import Ġorg . iq 8 0 . level db . Options Ċ import Ġplugin loader . api .* Ċ import Ġto wer . api .* Ċ import Ġjava . io . File Ċ import Ġjava . util .* Ċ import Ġjavax . xml . parsers . Document BuilderFactory Ċ import Ġkotlin . collections . ArrayList Ċ import Ġkotlin . collections . HashMap Ċ Ċ @ Conf Ċ internal Ġvar Ġconfig Ġ= ĠConfig () Ċ Ċ private Ġlateinit Ġvar Ġspi : Ġ( String , ĠK Serializer < Any >) Ġ-> ĠSPI < Any > Ċ Ċ interface ĠSPI < T >{ ĊĠĠĠ Ġfun Ġremove ( uuid : ĠUUID ) ĊĊĠĠĠ Ġfun Ġsave ( uuid : ĠUUID , Ġdata : ĠT ) ĊĊĠĠĠ Ġfun Ġload ( uuid : ĠUUID , Ġcallback : Ġ( data : ĠT ?) Ġ-> ĠUnit ) ĊĊĠĠĠ Ġfun Ġiterate ( callback : Ġ( uuid : ĠUUID , Ġdata : ĠT ) Ġ-> ĠUnit , Ġend : Ġ() Ġ-> ĠUnit ) ĊĊĠĠĠ Ġcompanion Ġobject { ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġfun Ġ< T > Ġget ( plugin : ĠLoader Plugin , Ġtable : ĠString , Ġk Serializer : ĠK Serializer < T >): ĠSPI < T > Ġ= Ġspi ( table , Ġk Serializer Ġas ĠK Serializer < Any >) Ġas ĠSPI < T > ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġlateinit Ġvar Ġpl u : ĠLoader Plugin Ċ Ċ private Ġval Ġjson Ġ= ĠJson { this . ignore Unknown Keys Ġ= Ġtrue } Ċ Ċ @ Internal Serialization Api Ċ @ Load Ċ internal Ġfun Ġload ( plugin : ĠLoader Plugin ){ ĊĠĠĠ Ġpl u Ġ= Ġplugin ĊĠĠĠ Ġif ( config . standalone ){ ĊĠĠĠĠĠĠĠ Ġval Ġdatabase Ġ= ĠDatabase ( File ( config . database Dir ), ĠOptions ()) ĊĠĠĠĠĠĠĠ Ġplugin . unload Handler Ġ{ Ġdatabase . close () Ġ} ĊĠĠĠĠĠĠĠ Ġspi Ġ= Ġ{ table , Ġserializer Ġ-> ĠS pi Impl ( database , Ġtable , Ġserializer )} ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġif ( config . server ){ ĊĠĠĠĠĠĠĠ Ġval Ġdatabase Ġ= ĠDatabase ( File ( config . database Dir ), ĠOptions ()) ĊĠĠĠĠĠĠĠ Ġplugin . unload Handler { database . close ()} ĊĠĠĠĠĠĠĠ Ġspi Ġ= Ġ{ table , Ġserializer Ġ-> ĠS pi Impl ( database , Ġtable , Ġserializer )} ĊĠĠĠĠĠĠĠ Ġval Ġserver Ġ= ĠT ower Server ( plugin ) !! ĊĠĠĠĠĠĠĠ Ġval Ġlocks Ġ= ĠHashMap < UUID , ĠString >() ĊĠĠĠĠĠĠĠ Ġval Ġunlock s Ġ= ĠHashMap < UUID , ĠMutable List < () Ġ-> ĠUnit >>() ĊĠĠĠĠĠĠĠ Ġserver . onClose ( plugin ){ name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġlocks . iterator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . forEach { if ( it . value Ġ== Ġname ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . unlock ( it . key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunlock s . remove ( it . key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . remove () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġclient : ĠT ower Connect ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif ( config . server Sharing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Ġ= ĠT ower Connect ( plugin ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient !!. old (). register (" remove ", Ġplugin , ĠDrop . serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . old (). register (" save ", Ġplugin , ĠSave . serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . old (). register (" load _ req ", Ġ" load _ res ", Ġplugin , ĠLoad Req . serializer (), ĠLoad Res . serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiterate Map Ġ= ĠHashMap < Int , ĠPair <( UUID , ĠByteArray ) Ġ-> ĠUnit , Ġ() Ġ-> ĠUnit >>() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . old (). register (" iter _ start ", Ġplugin , ĠIterate Start . serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . old (). register (" iter _ data ", Ġplugin , ĠIterate Data . serializer ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterate Map [ it . id ]. non Null { pair Ġ-> Ġpair . first ( it . uuid , Ġit . data )} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . old (). register (" iter _ end ", Ġplugin , ĠIterate End . serializer ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterate Map . remove ( it . id ). non Null { pair Ġ-> Ġpair . second ()} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . old (). register (" lock ", Ġplugin , ĠLock . serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . old (). register (" unlock ", Ġplugin , ĠUn lock . serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . old (). register (" spi . Server Re loaded ", Ġplugin , ĠServer Re loaded . serializer ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocks . forEach { client . send ( Lock ( it . key ))} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġserver . on Init ( pl u ){ name , Ġconnect Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnect . old (). register (" remove ", Ġplugin , ĠDrop . serializer ()){ drop Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( config . server Sharing Ġ&& Ġdrop . table Ġin Ġconfig . server Sharing Types ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient !!. send ( drop ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ register ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . drop ( drop . uuid , Ġdrop . table ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnect . old (). register (" save ", Ġplugin , ĠSave . serializer ()){ save Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( config . server Sharing Ġ&& Ġsave . table Ġin Ġconfig . server Sharing Types ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient !!. send ( save ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ register ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . push ( save . uuid , Ġsave . table , Ġsave . data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnect . old (). register Callback (" load _ req ", Ġ" load _ res ", Ġplugin , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Req . serializer (), ĠLoad Res . serializer ()){ Ġinput , Ġoutput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( config . server Sharing Ġ&& Ġinput . table Ġin Ġconfig . server Sharing Types ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient !!. request ( input ){ output ( it )} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ register Callback ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlock Ġ= Ġlocks [ input . uuid ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( lock Ġ!= Ġnull Ġ&& Ġlock Ġ!= Ġname ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunlock s . compute If Absent ( input . uuid ){ ArrayList ()}. add { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . get ( input . uuid , Ġinput . table ){ output ( Load Res ( input . uuid , Ġit ))} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ register Callback ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . get ( input . uuid , Ġinput . table ){ output ( Load Res ( input . uuid , Ġit ))} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnect . old (). register (" iter _ start ", Ġplugin , ĠIterate Start . serializer ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . iterate ( it . table , Ġ{ uuid , Ġdata Ġ-> Ġconnect . send ( Iterate Data ( it . id , Ġuuid , Ġdata )) }, Ġ{ connect . send ( Iterate End ( it . id )) }) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnect . old (). register (" iter _ data ", Ġplugin , ĠIterate Data . serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnect . old (). register (" iter _ end ", Ġplugin , ĠIterate End . serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnect . old (). register (" lock ", Ġplugin , ĠLock . serializer ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( config . server Sharing ) client !!. send ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( locks [ it . uuid ] Ġ== Ġname ) return @ register ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( locks [ it . uuid ] Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunlock s . compute If Absent ( it . uuid ){ ArrayList ()}. add { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . lock ( it . uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocks [ it . uuid ] Ġ= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ register ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . lock ( it . uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocks [ it . uuid ] Ġ= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnect . old (). register (" unlock ", Ġplugin , ĠUn lock . serializer ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( config . server Sharing ) client !!. send ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( locks [ it . uuid ] Ġ!= Ġname ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunlock s . compute If Absent ( it . uuid ){ ArrayList ()}. add { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . unlock ( it . uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocks . remove ( it . uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ register ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . unlock ( it . uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocks . remove ( it . uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunlock s . remove ( it . uuid ). non Null { list Ġ-> Ġlist . forEach { call Ġ-> Ġcall ()}} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnect . old (). register (" spi . Control Drop ", Ġplugin , ĠControl Drop . serializer ()){ database . delete ( it . uuid )} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnect . old (). register (" spi . Server Re loaded ", Ġplugin , ĠServer Re loaded . serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnect . send ( Server Re loaded ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġif ( config . client ){ ĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠT ower Connect ( plugin ) !! ĊĠĠĠĠĠĠĠ Ġclient . old (). register (" remove ", Ġplugin , ĠDrop . serializer ()) ĊĠĠĠĠĠĠĠ Ġclient . old (). register (" save ", Ġplugin , ĠSave . serializer ()) ĊĠĠĠĠĠĠĠ Ġclient . old (). register (" load _ req ", Ġ" load _ res ", Ġplugin , ĠLoad Req . serializer (), ĠLoad Res . serializer ()) ĊĠĠĠĠĠĠĠ Ġval Ġiterate Map Ġ= ĠHashMap < Int , ĠPair <( UUID , ĠByteArray ) Ġ-> ĠUnit , Ġ() Ġ-> ĠUnit >>() ĊĠĠĠĠĠĠĠ Ġvar Ġiterate Id Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġclient . old (). register (" iter _ start ", Ġplugin , ĠIterate Start . serializer ()) ĊĠĠĠĠĠĠĠ Ġclient . old (). register (" iter _ data ", Ġplugin , ĠIterate Data . serializer ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiterate Map [ it . id ]. non Null { pair Ġ-> Ġpair . first ( it . uuid , Ġit . data )} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġclient . old (). register (" iter _ end ", Ġplugin , ĠIterate End . serializer ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiterate Map . remove ( it . id ). non Null { pair Ġ-> Ġpair . second ()} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġclient . old (). register (" lock ", Ġplugin , ĠLock . serializer ()) ĊĠĠĠĠĠĠĠ Ġclient . old (). register (" unlock ", Ġplugin , ĠUn lock . serializer ()) ĊĠĠĠĠĠĠĠ Ġclient . old (). register (" spi . Control Drop ", Ġplugin , ĠControl Drop . serializer ()) ĊĠĠĠĠĠĠĠ Ġclient . old (). register (" spi . Server Re loaded ", Ġplugin , ĠServer Re loaded . serializer ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġonline Players . forEach { client . send ( Lock ( it . uuid ))} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcaching Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config . lock Support Ġ&& Ġplugin Ġis ĠPlugin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBu kkit Locks . join Ġ= Ġ{ Ġclient . send ( Lock ( it )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBu kkit Locks . quit Ġ= Ġ{ Ġclient . send ( Unlock ( it )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplugin . load ( Bu kkit Locks :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplugin . register Command (" spi ", Ġ{ Ġsender , Ġargs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sender . isNot Op ) Ġreturn @ register Command ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuuid Ġ= ĠUUID . fromString ( args [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . send ( Control Drop ( uuid )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsender . sendMessage (" ok ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġcheck Op Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}// not Ġbu kkit ĊĠĠĠĠĠĠĠ Ġspi Ġ= Ġ{ table , Ġserializer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject : ĠSPI < Any >{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġremove ( uuid : ĠUUID ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . send ( Drop ( table , Ġuuid )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsave ( uuid : ĠUUID , Ġdata : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . send ( Save ( table , Ġuuid , ĠJson . encode ToString ( serializer , Ġdata ). toByteArray ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġload ( uuid : ĠUUID , Ġcallback : Ġ( data : ĠAny ?) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Task Later ( config . tim ings Before ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . request ( Load Req ( table , Ġuuid )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġit . data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data Ġ== Ġnull ) Ġcallback ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvalue : ĠAny ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaching { value Ġ= Ġjson . decode FromString ( serializer , ĠString ( data ))} ?. printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġiterate ( callback : Ġ( uuid : ĠUUID , Ġdata : ĠAny ) Ġ-> ĠUnit , Ġend : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġiterate Id ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterate Map [ id ] Ġ= ĠPair ({ uuid , Ġdata Ġ-> Ġcallback ( uuid , ĠJson . decode FromString ( serializer , ĠString ( data ))) }, Ġend ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . send ( Iterate Start ( id , Ġtable )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġonline Players . forEach { client . send ( Lock ( it . uuid ))} ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Unload Ċ internal Ġfun Ġun load (){ ĊĠĠĠ Ġif ( config . client ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠT ower Connect ( pl u ) !! ĊĠĠĠĠĠĠĠ Ġonline Players . forEach { client . send ( Unlock ( it . uuid ))} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Serializable Ċ private Ġclass ĠDrop ( val Ġtable : ĠString , Ġval Ġuuid : Ġ@ Serializable ( UUID Serializer :: class ) ĠUUID ): ĠPacket Ċ Ċ @ Serializable Ċ private Ġclass ĠSave ( val Ġtable : ĠString , Ġval Ġuuid : Ġ@ Serializable ( UUID Serializer :: class ) ĠUUID , Ġval Ġdata : ĠByteArray ): ĠPacket Ċ Ċ @ Serializable Ċ private Ġclass ĠLoad Req ( val Ġtable : ĠString , Ġval Ġuuid : Ġ@ Serializable ( UUID Serializer :: class ) ĠUUID ): ĠRequest < Load Res > Ċ Ċ @ Serializable Ċ private Ġclass ĠLoad Res ( val Ġuuid : Ġ@ Serializable ( UUID Serializer :: class ) ĠUUID , Ġval Ġdata : ĠByteArray ?): ĠResponse Ċ Ċ @ Serializable Ċ private Ġclass ĠIterate Start ( val Ġid : ĠInt , Ġval Ġtable : ĠString ): ĠPacket Ċ Ċ @ Serializable Ċ private Ġclass ĠIterate Data ( val Ġid : ĠInt , Ġ@ Serializable ( UUID Serializer :: class ) Ġval Ġuuid : ĠUUID , Ġval Ġdata : ĠByteArray ): ĠPacket Ċ Ċ @ Serializable Ċ private Ġclass ĠIterate End ( val Ġid : ĠInt ): ĠPacket Ċ Ċ @ Serializable Ċ private Ġclass ĠLock ( val Ġuuid : Ġ@ Serializable ( UUID Serializer :: class ) ĠUUID ): ĠPacket Ċ Ċ @ Serializable Ċ private Ġclass ĠUn lock ( val Ġuuid : Ġ@ Serializable ( UUID Serializer :: class ) ĠUUID ): ĠPacket Ċ Ċ @ Serializable Ċ private Ġclass ĠServer Re loaded : ĠPacket Ċ Ċ @ Serializable Ċ private Ġclass ĠControl Drop ( val Ġuuid : Ġ@ Serializable ( UUID Serializer :: class ) ĠUUID ): ĠPacket Ċ Ċ @ Serializable Ċ internal Ġclass ĠConfig ( ĊĠĠĠĠĠĠĠ Ġval Ġclient : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġval Ġserver : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġval Ġstandalone : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġval Ġdatabase Dir : ĠString Ġ= Ġ" spi ", ĊĠĠĠĠĠĠĠ Ġval Ġtim ings Before : ĠInt Ġ= Ġ 1 0 , ĊĠĠĠĠĠĠĠ Ġval Ġtim ings Before Quit : ĠInt Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠ Ġval Ġlock Support : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġval Ġserver Sharing : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġval Ġserver Sharing Types : ĠSet < String > Ġ= Ġset Of () Ċ ) Ċ Ċ private Ġobject ĠBu kkit Locks { ĊĠĠĠ Ġvar Ġjoin : Ġ(( UUID ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĠĠĠ Ġvar Ġquit : Ġ(( UUID ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Listener ĊĠĠĠ Ġprivate Ġfun Ġon Join ( event : ĠPlayer Join Event ){ ĊĠĠĠĠĠĠĠ Ġjoin . non Null { it ( event . uuid )} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Listener ĊĠĠĠ Ġprivate Ġfun Ġon Quit ( event : ĠPlayer Quit Event ){ ĊĠĠĠĠĠĠĠ Ġquit . non Null { run Task Later ( config . tim ings Before Quit ){ it ( event . uuid )}} ĊĠĠĠ Ġ} Ċ }