import Ġarc . Events Ċ import Ġarc . util . CommandHandler Ċ import Ġarc . util . Time Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġkotlinx . serialization . json . Json Configuration Ċ import Ġmind ustry . Vars Ċ import Ġmind ustry . core . GameState Ċ import Ġmind ustry . entities . type . Player Ċ import Ġmind ustry . game . EventType Ċ import Ġmind ustry . gen . Call Ċ import Ġmind ustry . plugin . Plugin Ċ import Ġjava . io . File ĊĊ Ċ class ĠPause Plugin Ġ: ĠPlugin () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġlast Force Sync Ġ= Ġ 0 L ĊĠĠĠ Ġvar Ġconfig Ġ= Ġload Config () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠEvents . on ( EventType . Trigger . update ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Vars . state . is Paused ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Time . time Since Millis ( last Force Sync ) Ġ>= Ġ 1 0 0 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Force Sync Ġ= ĠTime . millis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforce Sync () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠEvents . on ( EventType . Player Join :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config . pause Auto Ġ&& ĠV ars . player Group . isEmpty Ġ&& ĠV ars . state . is Paused ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Resume Command ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠEvents . on ( EventType . Player Leave :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config . pause Auto Ġ&& ĠV ars . player Group . size () Ġ== Ġ 1 Ġ&& Ġ! Vars . state . is Paused ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pause Command ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġregister Client Commands ( handler : ĠCommand Handler ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandler . register (" pause ", Ġ" Pause Ġthe Ġgame .") Ġ{ Ġ_, Ġplayer : ĠPlayer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config . pause Permission Ġ== ĠPermission . ALL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġ( config . pause Permission Ġ== ĠPermission . ADMIN _ ONLY Ġ&& Ġplayer . isAdmin ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pause Command ( player ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPrinter . warn ( player , Ġ" You Ġare Ġnot Ġauthorized Ġto Ġuse Ġthis Ġcommand .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġhandler . register (" resume ", Ġ" Resume Ġthe Ġgame .") Ġ{ Ġ_, Ġplayer : ĠPlayer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config . pause Permission Ġ== ĠPermission . ALL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġ( config . pause Permission Ġ== ĠPermission . ADMIN _ ONLY Ġ&& Ġplayer . isAdmin ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Resume Command ( player ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPrinter . warn ( player , Ġ" You Ġare Ġnot Ġauthorized Ġto Ġuse Ġthis Ġcommand .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġregister Server Commands ( handler : ĠCommand Handler ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandler . register (" pause ", Ġ" Pause Ġthe Ġgame . ĠThis Ġcommand Ġcan Ġonly Ġbe Ġused Ġwhen Ġthe Ġserver Ġis Ġopen .") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pause Command ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġhandler . register (" resume ", Ġ" Resume Ġthe Ġgame . ĠThis Ġcommand Ġcan Ġonly Ġbe Ġused Ġwhen Ġthe Ġserver Ġis Ġopen .") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Resume Command ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġforce GameState ( state : ĠGameState . State ) Ġ{ ĊĠĠĠĠĠĠĠ ĠV ars . state . set ( state ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġforce Sync ( loading Fragment : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ ĠV ars . player Group . update Events () ĊĠĠĠĠĠĠĠ ĠV ars . player Group . forEach Ġ{ Ġplayer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . info . last Sync Time Ġ= ĠTime . millis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( loading Fragment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall . on World Data Begin ( player . con ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠV ars . net Server . send World Data ( player ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinject Pa usable () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Vars . state Ġ! is ĠPa usable GameState ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠV ars . state Ġ= ĠPa usable GameState . copyFrom ( Vars . state ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute Pause Command ( actor : ĠPlayer ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpause Game () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPrinter . info (" Game Ġpaused Ġby Ġ${ actor ?. name Ġ?: Ġ" host "} .") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠPause Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( actor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPrinter . warn ( actor , Ġe . message . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPrinter . warn ( e . message . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( actor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPrinter . error ( actor , Ġ" Fail Ġto Ġpause Ġthe Ġgame .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPrinter . error (" Fail Ġto Ġpause Ġthe Ġgame .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute Resume Command ( actor : ĠPlayer ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresume Game () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPrinter . info (" Game Ġres umed Ġby Ġ${ actor ?. name Ġ?: Ġ" host "} .") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠPause Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( actor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPrinter . warn ( actor , Ġe . message . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPrinter . warn ( e . message . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( actor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPrinter . error ( actor , Ġ" Fail Ġto Ġresume Ġthe Ġgame .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPrinter . error (" Fail Ġto Ġresume Ġthe Ġgame .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload Config (): ĠConfig Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjson Ġ= ĠJson ( Json Configuration . Stable ) ĊĠĠĠĠĠĠĠ Ġval Ġplugin File URI Ġ= Ġjava Class . protection Domain . code Source . location . to URI () ĊĠĠĠĠĠĠĠ Ġval Ġplugin Directory Ġ= ĠFile ( plugin File URI ). parent File ĊĠĠĠĠĠĠĠ Ġval Ġconfig File Ġ= ĠFile ( plugin Directory , Ġ" pause . json ") ĊĠĠĠĠĠĠĠ Ġif Ġ( configFile . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġjson . parse ( Config . serializer (), Ġconfig File . read Text ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠConfig (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig String Ġ= Ġjson . stringify ( Config . serializer (), Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig File . write Text ( config String ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpause Game () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( Vars . state . state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGameState . State . playing Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinject Pa usable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforce Sync ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforce GameState ( GameState . State . paused ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGameState . State . paused Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPause Exception (" The Ġgame Ġis Ġalready Ġpaused .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPause Exception (" This Ġcommand Ġcan Ġonly Ġbe Ġused Ġwhen Ġthe Ġserver Ġis Ġopen .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġresume Game () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( Vars . state . state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGameState . State . paused Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforce GameState ( GameState . State . playing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforce Sync ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGameState . State . playing Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPause Exception (" The Ġgame Ġis Ġalready Ġres umed .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPause Exception (" This Ġcommand Ġcan Ġonly Ġbe Ġused Ġwhen Ġthe Ġserver Ġis Ġopen .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ