package Ġcom . ch att riggers . ct js . engine . module Ċ Ċ import Ġcom . ch att riggers . ct js . CT JS Ċ import Ġcom . ch att riggers . ct js . Reference Ċ import Ġcom . ch att riggers . ct js . engine . langs . js . JS Loader Ċ import Ġcom . ch att riggers . ct js . engine . IL o ader Ċ import Ġcom . ch att riggers . ct js . launch . Ind y Support Ċ import Ġcom . ch att riggers . ct js . minecraft . libs . File Lib Ċ import Ġcom . ch att riggers . ct js . print Trace To Console Ċ import Ġcom . ch att riggers . ct js . triggers . Trigger Type Ċ import Ġcom . ch att riggers . ct js . utils . Config Ċ import Ġcom . ch att riggers . ct js . utils . console . Console Ċ import Ġorg . apache . commons . io . FileUtils Ċ import Ġjava . io . File Ċ import Ġjava . lang . IllegalArgumentException Ċ import Ġjava . lang . invoke . Method Handle Ċ Ċ object ĠModule Manager Ġ{ ĊĠĠĠ Ġval Ġload ers Ġ= ĠlistOf ( JS Loader ) ĊĠĠĠ Ġval Ġgeneral Console Ġ= ĠConsole ( null ) ĊĠĠĠ Ġval Ġcached Modules Ġ= Ġmutable ListOf < Module >() ĊĠĠĠ Ġval Ġmodules Folder Ġ= ĠFile ( Config . modules Folder ) ĊĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġmodules Folder . mkdir s () ĊĊĠĠĠĠĠĠĠ Ġ// ĠDownload Ġpending Ġmodules ĊĠĠĠĠĠĠĠ ĠModule Updater . import Pending Modules () ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġexisting Ġmodules ĊĠĠĠĠĠĠĠ Ġval Ġinstalled Modules Ġ= Ġget Folders In Dir ( modules Folder ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse Module ( it ) ĊĠĠĠĠĠĠĠ Ġ}. distinct By Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . name . lowercase () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġthose Ġmodules Ġhave Ġupdates ĊĠĠĠĠĠĠĠ Ġinstalled Modules . forEach ( Module Updater :: update Module ) ĊĠĠĠĠĠĠĠ Ġcached Modules . addAll ( installed Modules ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠImport Ġrequired Ġmodules ĊĠĠĠĠĠĠĠ Ġinstalled Modules . as Sequence (). map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . metadata . requires ĊĠĠĠĠĠĠĠ Ġ}. flatten (). distinct (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModule Updater . import Module ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠLoad Ġtheir Ġassets ĊĠĠĠĠĠĠĠ Ġload Assets ( cached Modules ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠNormalize Ġall Ġmetadata ĊĠĠĠĠĠĠĠ Ġcached Modules . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . metadata . entry Ġ= Ġit . metadata . entry ?. replace ('/', ĠFile . separator Char )?. replace ('\\ ', ĠFile . separator Char ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġall Ġj ars ĊĠĠĠĠĠĠĠ Ġval Ġj ars Ġ= Ġcached Modules . map Ġ{ Ġmodule Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodule . folder . walk (). filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isFile Ġ&& Ġit . extension Ġ== Ġ" jar " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . to URI (). to URL () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toList () ĊĠĠĠĠĠĠĠ Ġ}. flatten () ĊĊĠĠĠĠĠĠĠ Ġ// ĠSetup Ġall Ġload ers ĊĠĠĠĠĠĠĠ Ġload ers . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . setup ( j ars ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe 're Ġfinished Ġsetting Ġup Ġall Ġof Ġour Ġload ers , ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġwhich Ġmeans Ġthey Ġcan Ġnow Ġhave Ġtheir ĠAS M Ġinvocation Ġre - look ups Ġhappen ĊĠĠĠĠĠĠĠ ĠIn dy Support . invalidate Inv ocations () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġasm Pass () Ġ{ ĊĠĠĠĠĠĠĠ Ġload ers . forEach ( IL o ader :: asm Setup ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠLoad Ġthe Ġmodules ĊĠĠĠĠĠĠĠ Ġload ers . forEach Ġ{ Ġloader Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcached Modules . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( it . folder , Ġit . metadata . asm Entry Ġ?: Ġreturn @ filter Ġfalse ). extension Ġ== Ġloader . get Language (). extension ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloader . asm Pass ( it , ĠFile ( it . folder , Ġit . metadata . asm Entry !! ). to URI ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġentry Pass ( modules : ĠList < Module > Ġ= Ġcached Modules , Ġcompletion Listener : Ġ( percent Complete : ĠFloat ) Ġ-> ĠUnit Ġ= Ġ{}) Ġ{ ĊĠĠĠĠĠĠĠ Ġload ers . forEach ( IL o ader :: entry Setup ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtotal Ġ= Ġmodules . count Ġ{ Ġit . metadata . entry Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġcompleted Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ// ĠLoad Ġthe Ġmodules ĊĠĠĠĠĠĠĠ Ġload ers . forEach Ġ{ Ġloader Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodules . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( it . folder , Ġit . metadata . entry Ġ?: Ġreturn @ filter Ġfalse ). extension Ġ== Ġloader . get Language (). extension ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloader . entry Pass ( it , ĠFile ( it . folder , Ġit . metadata . entry !! ). to URI ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompleted ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompletion Listener ( completed . toFloat () Ġ/ Ġtotal ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġasm Invoke Lookup ( moduleName : ĠString , Ġfunction ID : ĠString ): ĠMethod Handle Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠFind Ġthe Ġtargeted Ġmodule ĊĠĠĠĠĠĠĠ Ġval Ġmodule Ġ= Ġcached Modules . first Ġ{ Ġit . name Ġ== ĠmoduleName Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġtarget Ġfunction Ġfile Ġfrom Ġthe Ġmetadata Ġlookup Ġtable ĊĠĠĠĠĠĠĠ Ġval Ġfunc Path Ġ= Ġmodule . metadata . asm Ex posed Functions ?. get ( function ID ) Ġ?: Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Module Ġ$ module Ġcontains Ġno Ġasm Ġexported Ġfunction Ġwith Ġid Ġ$ function ID " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfunc File Ġ= ĠFile ( module . folder , Ġfunc Path . replace ('/', ĠFile . separator Char ). replace ('\\ ', ĠFile . separator Char )) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġload ers . first Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . get Language (). extension Ġ== Ġfunc File . extension ĊĠĠĠĠĠĠĠ Ġ}. asm Invoke Lookup ( module , Ġfunc File . to URI ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Folders In Dir ( dir : ĠFile ): ĠList < File > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! dir . isDirectory ) Ġreturn Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdir . list Files ()?. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . isDirectory ĊĠĠĠĠĠĠĠ Ġ} Ġ?: ĠlistOf () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse Module ( directory : ĠFile ): ĠModule Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmetadata File Ġ= ĠFile ( directory , Ġ" metadata . json ") ĊĠĠĠĠĠĠĠ Ġvar Ġmetadata Ġ= ĠModule Metadata () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( metadata File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata Ġ= ĠCT JS . gson . fromJson ( File Lib . read ( metadata File ), ĠModule Metadata :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception . print Trace To Console () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠModule ( directory . name , Ġmetadata , Ġdirectory ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġimport Module ( moduleName : ĠString ): ĠModule ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Modules Ġ= ĠModule Updater . import Module ( moduleName ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠLoad Ġtheir Ġassets ĊĠĠĠĠĠĠĠ Ġload Assets ( new Modules ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠNormalize Ġall Ġmetadata ĊĠĠĠĠĠĠĠ Ġnew Modules . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . metadata . entry Ġ= Ġit . metadata . entry ?. replace ('/', ĠFile . separator Char )?. replace ('\\ ', ĠFile . separator Char ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠPrint Ġwarning Ġto Ġconsole Ġif Ġmet adat as Ġcontain Ġan Ġasm Ġkey ĊĊĠĠĠĠĠĠĠ Ġentry Pass ( new Modules ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnew Modules . get OrNull ( 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete Module ( name : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodule Ġ= Ġcached Modules . find Ġ{ Ġit . name . lowercase () Ġ== Ġname . lowercase () Ġ} Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( modules Folder , Ġmodule . name ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġthrow ĠIllegalStateException (" Expected Ġmodule Ġto Ġhave Ġan Ġexisting Ġfolder !") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( file . delete Re cursively ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠReference . load CT () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Assets ( modules : ĠList < Module >) Ġ{ ĊĠĠĠĠĠĠĠ Ġmodules . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( it . folder , Ġ" assets ") ĊĠĠĠĠĠĠĠ Ġ}. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . exists () Ġ&& Ġ! it . isFile ĊĠĠĠĠĠĠĠ Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . list Files ()?. toList () Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠ Ġ}. flatten (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFileUtils . copy File To Directory ( it , ĠCT JS . assets Dir ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġteardown () Ġ{ ĊĠĠĠĠĠĠĠ Ġcached Modules . clear () ĊĊĠĠĠĠĠĠĠ Ġload ers . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . clear Triggers () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Config . clear Console OnLoad ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . console . clear Console () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Config . clear Console OnLoad ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeneral Console . clear Console () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtrigger ( type : ĠTrigger Type , Ġarguments : ĠArray < out ĠAny ?> ) Ġ{ ĊĠĠĠĠĠĠĠ Ġload ers . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . exec ( type , Ġarguments ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Console ( language : ĠString ): ĠConsole Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġload ers . first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . get Language (). lang Name Ġ== Ġlanguage ĊĠĠĠĠĠĠĠ Ġ} ?. console Ġ?: Ġgeneral Console ĊĠĠĠ Ġ} Ċ } Ċ